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.


É 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]

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]

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.