Golang:将切片转换为地图

时间:2016-07-26 00:46:19

标签: go maps slice

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

在我的Go代码中,我有一些字符串片段,并希望将其转换为地图。我想知道是否有Go的库代码来执行此操作。

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

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

感谢

4 个答案:

答案 0 :(得分:12)

使用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

标准库没有执行此操作的功能。

答案 1 :(得分: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
}

答案 2 :(得分:0)

如果要查找库,可以使用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

答案 3 :(得分:0)

尝试范围

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