Golang: convert slices into map

前端 未结 4 1511
抹茶落季
抹茶落季 2021-01-07 18:20

Is there an easy/simple means of converting a slice into a map in Golang? Like converting an array into hash in perl is easy to do with simple assignment like %hash =

相关标签:
4条回答
  • 2021-01-07 18:57

    If looking for a library you can use go-funk. This code may be less performant and not idiomatic in Go until we have Generics.

    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

    0 讨论(0)
  • 2021-01-07 19:05

    Use a for loop:

    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

    The standard library does not have a function to do this.

    0 讨论(0)
  • 2021-01-07 19:14

    Try with range

    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

    0 讨论(0)
  • 2021-01-07 19:21

    There is currently no way to do it the perl way. You just have to iterate the slice, and place the slice elements in your map, e.g. as the map's key:

    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)
        }
    }
    

    Depending on what you want to do, you have to keep one thing in mind: map keys are unique, so if your slice contains duplicate strings you might want to keep count by using a 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)
        }
    }
    

    And you can always wrap that functionality in a 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
    }
    
    0 讨论(0)
提交回复
热议问题