Iterando através de um mapa golang

89

Eu tenho um mapa do tipo: map[string]interface{}

E, finalmente, posso criar algo como (após desserializar de um arquivo yml usando goyaml)

mymap = map[foo:map[first: 1] boo: map[second: 2]]

Como posso iterar neste mapa? Tentei o seguinte:

for k, v := range mymap{
...
}

Mas recebo um erro:

cannot range over mymap
typechecking loop involving for loop

Por favor ajude.

Ashokgelal
fonte
É possível fornecer um caso de teste? É difícil diagnosticar o problema pelo que você postou, pois não há nada inerente ao que você postou que pudesse causar um loop de verificação de tipo. Em particular, estou tendo problemas para descobrir como você obteria um loop de verificação de tipo em um corpo de função.
SteveMcQwark

Respostas:

107

Por exemplo,

package main

import "fmt"

func main() {
    type Map1 map[string]interface{}
    type Map2 map[string]int
    m := Map1{"foo": Map2{"first": 1}, "boo": Map2{"second": 2}}
    //m = map[foo:map[first: 1] boo: map[second: 2]]
    fmt.Println("m:", m)
    for k, v := range m {
        fmt.Println("k:", k, "v:", v)
    }
}

Resultado:

m: map[boo:map[second:2] foo:map[first:1]]
k: boo v: map[second:2]
k: foo v: map[first:1]
PeterSO
fonte
4

Você pode fazer isso por uma linha:

mymap := map[string]interface{}{"foo": map[string]interface{}{"first": 1}, "boo": map[string]interface{}{"second": 2}}
for k, v := range mymap {
    fmt.Println("k:", k, "v:", v)
}

O resultado é:

k: foo v: map[first:1]
k: boo v: map[second:2]
Bryce
fonte
21
Provérbio Go: Não seja inteligente, seja explícito. One-liners não são o objetivo do Go.
Inanc Gumus
2

Você poderia simplesmente escrever em várias linhas assim,

$ cat dict.go
package main

import "fmt"

func main() {
        items := map[string]interface{}{
                "foo": map[string]int{
                        "strength": 10,
                        "age": 2000,
                },
                "bar": map[string]int{
                        "strength": 20,
                        "age": 1000,
                },
        }
        for key, value := range items {
                fmt.Println("[", key, "] has items:")
                for k,v := range value.(map[string]int) {
                        fmt.Println("\t-->", k, ":", v)
                }

        }
}

E a saída:

$ go run dict.go
[ foo ] has items:
        --> strength : 10
        --> age : 2000
[ bar ] has items:
        --> strength : 20
        --> age : 1000
Han Solo
fonte