遍历golang中的map数据结构

114

我有一个类型为:map[string]interface{}的映射表

最终,我得到创建类似以下内容的东西(在使用goyaml从yml文件进行反序列化之后)

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

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

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

但我得到了一个错误:

cannot range over mymap
typechecking loop involving for loop

请帮忙。


能否提供一个测试用例呢?从您发布的内容中很难诊断问题,因为没有什么东西可以引起类型检查循环。特别是,我无法弄清楚您如何在函数体中得到类型检查循环的问题。 - SteveMcQwark
3个回答

131
例如,
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)
    }
}

输出:

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

5

你可以像这样使用多行方式编写它:

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

        }
}

输出结果:

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

谢谢。你会如何称呼代码 value.(map[string]int) 的部分?在 Go 中,这被称为 "将 value 强制转换为新类型" 吗?(我是 Go 新手) - 123
1
@123 我认为,类型断言 https://go.dev/tour/methods/15 - han solo

3
您只需要一行代码即可实现:
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)
}

输出结果为:

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

26
围棋谚语:“不要聪明,要清晰明确。在围棋中,一句话式的结论并不是目标。” - Inanc Gumus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接