【问题标题】:Iterating through a golang map遍历 golang 地图
【发布时间】:2011-12-22 13:17:55
【问题描述】:

我有一张地图类型: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

请帮忙。

【问题讨论】:

  • 可以提供测试用例吗?很难从您发布的内容中诊断问题,因为您发布的内容没有任何固有的东西可能导致类型检查循环。特别是,我无法弄清楚如何在函数体中获得类型检查循环。

标签: map go loops


【解决方案1】:

例如,

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]

【讨论】:

    【解决方案2】:

    一行一行就可以了:

    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]
    

    【讨论】:

    • Go 谚语:不要聪明,要明确。单行不是 Go 的目标。
    【解决方案3】:

    你可以像这样在多行中写出来,

    $ 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
    

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 2011-03-23
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2015-12-30
      相关资源
      最近更新 更多