Golang:转换的薄片,放入地图

问题描述 投票:12回答:2

是否有一个片转换成Golang地图的简单/简单的方法?像变换的阵列成散列在Perl很容易用简单的赋值像%hash = @array这上面将所述阵列中的所有元素转换成散列值,与键在偶数索引的元素,而值将是奇数索引元件做阵列。

在我去的代码,我有串片,并想将其转换为一个地图。我想知道是否有去图书馆的代码来做到这一点。

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

元素切片应该被转换为地图串,elementMap

谢谢

go maps slice
2个回答
14
投票

使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.