【问题标题】:Golang: convert slices into mapGolang:将切片转换为地图
【发布时间】:2016-11-29 11:43:01
【问题描述】:

有没有一种简单/简单的方法可以在 Golang 中将切片转换为地图?就像在 perl 中将数组转换为哈希一样,通过 %hash = @array 之类的简单赋值很容易做到 以上会将数组中的所有元素转换为哈希,其中键是偶数索引元素,而值将是数组的奇数索引元素。

在我的 Go 代码中,我有一段字符串,并希望将其转换为地图。我想知道是否有 Go 的库代码可以做到这一点。

func main() {
  var elements []string
  var elementMap map[string]string
  elements = []string{"abc", "def", "fgi", "adi"}
}

元素切片应转换为字符串映射,elementMap

谢谢

【问题讨论】:

    标签: go maps slice


    【解决方案1】:

    使用 for 循环:

    elements = []string{"abc", "def", "fgi", "adi"}
    elementMap := make(map[string]string)
    for i := 0; i < len(elements); i +=2 {
        elementMap[elements[i]] = elements[i+1]
    }
    

    runnable example on the playground

    标准库没有执行此操作的函数。

    【讨论】:

    • 我觉得我们应该为其中的一些数据结构助手创建一个标准库
    【解决方案2】:

    目前没有办法以 perl 的方式进行。您只需要迭代切片,并将切片元素放在地图中,例如作为地图的关键:

    func main() {
        var elements []string
        var elementMap map[string]string
        elements = []string{"abc", "def", "fgi", "adi"}
    
        // initialize map
        elementMap = make(map[string]string)
    
        // put slice values into map
        for _, s := range elements {  
            elementMap[s] = s
            // or just keys, without values: elementMap[s] = ""
        }
    
        // print map
        for k := range elementMap {
            fmt.Println(k)
        }
    }
    

    根据您要执行的操作,您必须记住一件事:映射键是唯一的,因此如果您的切片包含重复的字符串,您可能需要使用 map[string]int 来保持计数:

    func main() {
        var elements []string
        var elementMap map[string]int
        elements = []string{"abc", "def", "fgi", "adi", "fgi", "adi"}
    
        // initialize map
        elementMap = make(map[string]int)
    
        // increment map's value for every key from slice
        for _, s := range elements {  
            elementMap[s]++
        }
    
        // print map
        for k, v := range elementMap {
            fmt.Println(k, v)
        }
    }
    

    而且您总是可以将该功能包装在一个 func 中:

    func sliceToStrMap(elements []string) map[string]string {
        elementMap := make(map[string]string)
        for _, s := range elements {
            elementMap[s] = s
        }
        return elementMap
    }
    
    func sliceToIntMap(elements []string) map[string]int {
        elementMap := make(map[string]int)
        for _, s := range elements {
            elementMap[s]++
        }
        return elementMap
    }
    

    【讨论】:

      【解决方案3】:

      如果要查找库,您可以使用go-funk。在我们有了泛型之前,这段代码在 Go 中可能性能较差且不习惯。

      var elements = []string{"abc", "def", "fgi", "adi"}
      
      elementsMap := funk.Map(
          funk.Chunk(elements, 2),
          func(x []string) (string, string) { // Slice to Map
              return x[0], x[1]
          },
      )
      
      fmt.Println(elementsMap) // map[abc:def fgi:adi]
      

      https://play.golang.org/p/-t-33z4aKM_j

      【讨论】:

        【解决方案4】:

        用范围试试

        elements := []string{"abc", "def", "fgi", "adi"}
            elementMap := make(map[int]string)
            for i, data := range elements  {
                     elementMap[i] = data
                }
        
        fmt.Println(elementMap ) // map[0:abc 1:def 2:fgi 3:adi]
        

        https://play.golang.org/p/h6uZn5obLKg

        【讨论】:

          猜你喜欢
          • 2021-08-18
          • 2018-01-04
          • 2017-03-26
          • 2019-03-09
          • 1970-01-01
          • 2016-05-23
          • 1970-01-01
          • 2019-12-23
          • 1970-01-01
          相关资源
          最近更新 更多