Iterando a través de un mapa de golang

89

Tengo un mapa de tipo: map[string]interface{}

Y finalmente, puedo crear algo como (después de deserializar desde un archivo yml usando goyaml)

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

¿Cómo puedo recorrer este mapa? Intenté lo siguiente:

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

Pero me sale un error:

cannot range over mymap
typechecking loop involving for loop

Por favor ayuda.

ashokgelal
fuente
¿Es posible proporcionar un caso de prueba? Es difícil diagnosticar el problema a partir de lo que ha publicado, ya que no hay nada inherente a lo que ha publicado que pueda provocar un bucle de verificación de tipos. En particular, tengo problemas para averiguar cómo obtendría un bucle de verificación de tipo en el cuerpo de una función.
SteveMcQwark

Respuestas:

107

Por ejemplo,

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

Salida:

m: map[boo:map[second:2] foo:map[first:1]]
k: boo v: map[second:2]
k: foo v: map[first:1]
peterSO
fuente
4

Puedes hacerlo por una línea:

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

La salida es:

k: foo v: map[first:1]
k: boo v: map[second:2]
Bryce
fuente
20
Vaya proverbio: No sea inteligente, sea explícito. Las frases sencillas no son el objetivo en Go.
Inanc Gumus
2

Podrías escribirlo en varias líneas así,

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

        }
}

Y la salida:

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