在 Golang 地图上迭代

我有一张类型为 map[string]interface{}的地图

最后,我将创建类似的代码(在使用 goyaml 从 yml 文件反序列化之后)

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

我如何迭代这个映射? 我尝试了以下方法:

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

但我得到了一个错误:

cannot range over mymap
typechecking loop involving for loop

请帮帮我。

124495 次浏览

For example,

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

Output:

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

You can make it by one line:

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

Output is:

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

You could just write it out in multiline like this,

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


}
}

And the output:

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