遍历地图的所有键


315

有没有一种方法可以获取Go语言映射中所有键的列表?元素的数量由给出len(),但是如果我有类似的地图:

m := map[string]string{ "key1":"val1", "key2":"val2" };

如何遍历所有键?

Answers:


544

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

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

要么

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

for语句的Go语言规范指定第一个值是键,第二个变量是值,但不必存在。


22
作为可能的陷阱,请注意,迭代顺序未定义。groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna 2012年

23
Sudhir:golang语言规范将映射定义为具有未定义的键顺序。此外,从Go 1开始,故意在运行之间随机分配键顺序,以防止依赖于任何感知的顺序。
Mark Renouf

6
请注意,这不是可变的迭代,也就是说,删除密钥将需要您重新启动迭代。
瑞克·史密斯

同样对于小型数据集,映射顺序是可以预测的。
活泉

14

这是获取slice映射键的一些简单方法。

// 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]
}

Keys函数是否可以使用任何类型的键而不只是字符串来映射?
罗伯特·麦吉本

func Keys(m map[interface{}]interface{}) (keys []interface{}),@ RobertT.McGibbon,您需要更改函数“ prototype”
a8m 2015年

1
@ArielM。那只适用于确切的类型map[interface{}]interface{}。Go不支持泛型。您无法使用带有map接受具有不同键类型的映射的参数的函数来创建该函数。
icza 2015年

10

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

ks := reflect.ValueOf(m).MapKeys()

如何遍历所有键?

使用公认的答案:

for k, _ := range m { ... }

1
我认为您的意思是for _, k := range v.MapKeys(),因为在您的示例中,k将是键片的int索引
Brian Leishman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.