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.


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]

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]

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.