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.


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

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]

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.