Iterasi melalui peta golang

89

Saya memiliki tipe peta: map[string]interface{}

Dan akhirnya, saya bisa membuat sesuatu seperti (setelah deserialisasi dari file yml menggunakan goyaml)

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

Bagaimana cara melakukan iterasi melalui peta ini? Saya mencoba yang berikut ini:

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

Tapi saya mendapatkan kesalahan:

cannot range over mymap
typechecking loop involving for loop

Tolong bantu.

ashokgelal.dll
sumber
Apakah mungkin untuk memberikan kasus uji? Sulit untuk mendiagnosis masalah dari apa yang Anda posting, karena tidak ada yang melekat pada apa yang Anda posting yang dapat menyebabkan loop pemeriksaan jenis. Secara khusus, saya mengalami kesulitan mencari tahu bagaimana Anda akan mendapatkan pengulangan pemeriksaan tipe di badan fungsi.
SteveMcQwark

Jawaban:

107

Sebagai contoh,

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

Keluaran:

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

Anda bisa membuatnya dengan satu baris:

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

Outputnya adalah:

k: foo v: map[first:1]
k: boo v: map[second:2]
Bryce
sumber
21
Pepatah: Jangan pintar, eksplisit. Satu kalimat bukanlah tujuan di Go.
Inanc Gumus
2

Anda bisa menuliskannya dalam multiline seperti ini,

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

        }
}

Dan hasilnya:

$ go run dict.go
[ foo ] has items:
        --> strength : 10
        --> age : 2000
[ bar ] has items:
        --> strength : 20
        --> age : 1000
han solo
sumber