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.


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]

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]

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.