2009-12-03 34 views
187

有没有办法获得Go语言地图中所有键的列表?元素的数量由len()给出,但如果我有一张地图,如:迭代地图的所有键

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

如何遍历所有的钥匙?

回答

310

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

Go language specs for for statements指定的第一个值是密钥,第二变量是值,但不必须存在。

+9

作为一种可能的疑难杂症,注意迭代的顺序是不确定的。 https://groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ – mna

+15

Sudhir:golang语言规范明确地将地图定义为具有未定义的键排序。此外,从Go 1开始,按键顺序在运行之间有意地随机化以防止依赖于任何感知的顺序。 –

+3

请注意,这不是一个可变的迭代,也就是说删除一个键将需要您重新开始迭代。 –

8

这里有一些简单的方法来获得地图键的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] 
} 
+0

“Keys”函数是否可以使用任何类型的键映射地图,而不仅仅是字符串? –

+0

'FUNC键(米地图[接口{}]接口{})(键[]接口{})',@ RobertT.McGibbon你需要改变功能 “原型” – a8m

+1

@ArielM。这只适用于确切类型'map [interface {}] interface {}'。 Go不支持泛型。你不能用一个'map'参数来创建一个函数,它接受具有不同键类型的地图。 – icza

2

有没有办法让一个围棋语言地图的所有键的列表?

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

我怎么遍历所有的钥匙?

使用公认的答案:

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