Bir golang haritasında yineleme


89

Şu türde bir haritam var: map[string]interface{}

Ve son olarak, (goyaml kullanarak bir yml dosyasından seriyi kaldırdıktan sonra) gibi bir şey oluşturuyorum.

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

Bu haritayı nasıl yineleyebilirim? Aşağıdakileri denedim:

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

Ama bir hata alıyorum:

cannot range over mymap
typechecking loop involving for loop

Lütfen yardım et.


Bir test senaryosu sağlamak mümkün mü? Gönderdiğiniz şeyden sorunu teşhis etmek zordur, çünkü gönderdiklerinize özgü bir tür kontrol döngüsüne neden olabilecek hiçbir şey yoktur. Özellikle, bir işlev gövdesinde bir tür kontrol döngüsünü nasıl elde edeceğinizi anlamakta zorlanıyorum.
SteveMcQwark

Yanıtlar:


107

Örneğin,

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

Çıktı:

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

4

Tek satırda yapabilirsiniz:

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

Çıktı:

k: foo v: map[first:1]
k: boo v: map[second:2]

21
Go Atasözü: Akıllı olmayın, açık olun. Go'da hedef tek gömlek değil.
İnanç Gümüş

2

Bunu çok satırlı olarak şöyle yazabilirsiniz,

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

        }
}

Ve çıktı:

$ go run dict.go
[ foo ] has items:
        --> strength : 10
        --> age : 2000
[ bar ] has items:
        --> strength : 20
        --> age : 1000
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.