[英]Golang: convert slices into map
有没有一种简单/简单的方法可以在 Golang 中将切片转换为 map? 就像在 perl 中将数组转换为 hash 一样,通过%hash = @array
之类的简单赋值很容易做到这一点,上面会将数组中的所有元素转换为 Z0800FC577294C34E0B28AD2839435945数组的编号索引元素。
在我的 Go 代码中,我有一段字符串,并希望将其转换为 map。 我想知道是否有 Go 的库代码可以做到这一点。
func main() {
var elements []string
var elementMap map[string]string
elements = []string{"abc", "def", "fgi", "adi"}
}
元素切片应转换为字符串 elementMap 的elementMap
。
谢谢
使用 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]
}
标准库没有执行此操作的功能。
目前没有办法以 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
}
如果要查找库,您可以使用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]
尝试范围
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]
使用泛型:
func Map[T any, V comparable](src []T, key func(T) V) map[V]T {
var result = make(map[V]T)
for _, v := range src {
result[key(v)] = v
}
return result
}
我只是稍微改变了ngotd的绝妙方法以保留参考。
func Map[T any, V comparable](src []T, key func(T) V) map[V]T {
var result = make(map[V]T)
for idx := range src {
el := src[idx]
result[key(el)] = el
}
return result
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.