繁体   English   中英

Golang:将切片转换为 map

[英]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]

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

尝试范围

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

使用泛型:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM