是否有一种简单/简单的方法可以将切片转换为Golang中的地图?就像使用%hash = @array
之类的简单赋值一样,将数组转换为perl中的哈希很容易
上面将把数组中的所有元素转换为散列,其中键是偶数索引元素,而值将是数组的奇数索引元素。
在我的Go代码中,我有一些字符串片段,并希望将其转换为地图。我想知道是否有Go的库代码来执行此操作。
func main() {
var elements []string
var elementMap map[string]string
elements = []string{"abc", "def", "fgi", "adi"}
}
元素切片应转换为字符串映射elementMap
。
感谢
答案 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]
答案 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]