Durch eine Golang-Karte iterieren

89

Ich habe eine Karte vom Typ: map[string]interface{}

Und schließlich kann ich so etwas wie erstellen (nach dem Deserialisieren aus einer yml-Datei mit goyaml)

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

Wie kann ich diese Karte durchlaufen? Ich habe folgendes versucht:

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

Aber ich bekomme eine Fehlermeldung:

cannot range over mymap
typechecking loop involving for loop

Bitte helfen Sie.

ashokgelal
quelle
Ist es möglich, einen Testfall bereitzustellen? Es ist schwierig, das Problem anhand der von Ihnen veröffentlichten Informationen zu diagnostizieren, da nichts, was Sie veröffentlicht haben, inhärent ist und eine Typprüfungsschleife verursachen könnte. Insbesondere habe ich Probleme herauszufinden, wie Sie eine Typprüfschleife in einem Funktionskörper erhalten würden.
SteveMcQwark

Antworten:

107

Zum Beispiel,

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

Ausgabe:

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

Sie können es durch eine Zeile machen:

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

Ausgabe ist:

k: foo v: map[first:1]
k: boo v: map[second:2]
Bryce
quelle
20
Sprichwort: Sei nicht schlau, sei explizit. Einzeiler sind nicht das Ziel in Go.
Inanc Gumus
2

Sie könnten es einfach so mehrzeilig ausschreiben,

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

        }
}

Und die Ausgabe:

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