迭代地图的所有键

Mar*_*ond 284 dictionary loops go

有没有办法获取Go语言地图中所有键的列表?元素的数量由len(),但如果我有一个像这样的地图:

m := map[string]string{ "key1":"val1", "key2":"val2" };
Run Code Online (Sandbox Code Playgroud)

如何迭代所有键?

Jon*_*erg 486

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}
Run Code Online (Sandbox Code Playgroud)

要么

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}
Run Code Online (Sandbox Code Playgroud)

Go语言规范for声明指定第一个值是键,第二个变量是值,但不必存在.

  • Sudhir:golang语言规范明确地将地图定义为具有未定义的键排序.此外,由于Go 1,密钥顺序在运行之间被有意地随机化以防止依赖于任何感知的顺序. (22认同)
  • 作为一个可能的问题,请注意迭代的顺序是未定义的.https://groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ (17认同)
  • 请注意,这不是可变迭代,也就是说删除密钥将要求您重新启动迭代. (5认同)

a8m*_*a8m 12

这里有一些简单的方法来获取slicemap-keys.

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}
Run Code Online (Sandbox Code Playgroud)


Sri*_*har 7

有没有一种方法可以获取Go语言映射中所有键的列表?

ks := reflect.ValueOf(m).MapKeys()
Run Code Online (Sandbox Code Playgroud)

如何遍历所有键?

使用公认的答案:

for k, _ := range m { ... }
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的意思是 `for _, k := range v.MapKeys()`,因为在你的例子中,`k` 将是键切片的 int 索引 (2认同)

Moh*_*sen 6

类型无关的解决方案:

for _, key := range reflect.ValueOf(yourMap).MapKeys() {
    value := yourMap.MapIndex(key).Interface()
    fmt.Println("Key:", key, "Value:", value)
}  
Run Code Online (Sandbox Code Playgroud)