遍历地图的所有键

Posted

技术标签:

【中文标题】遍历地图的所有键【英文标题】:Iterating over all the keys of a map 【发布时间】:2010-12-22 22:09:27 【问题描述】:

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

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

如何遍历所有键?

【问题讨论】:

【参考方案1】:

与类型无关的解决方案:

for _, key := range reflect.ValueOf(yourMap).MapKeys() 
    value := s.MapIndex(key).Interface()
    fmt.Println("Key:", key, "Value:", value)
  

【讨论】:

【参考方案2】:

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 指定第一个值是键,第二个变量是值,但不必存在。

【讨论】:

作为一个可能的陷阱,请注意迭代的顺序是未定义的。 groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ Sudhir:golang 语言规范明确将映射定义为具有未定义的键顺序。此外,从 Go 1 开始,键顺序在运行之间有意随机化,以防止依赖于任何感知顺序。 请注意,这不是一个可变迭代,也就是说删除一个键将需要您重新启动迭代。 对于小型数据集,地图顺序也可以预测。【参考方案3】:

有没有办法获取 Go 语言映射中所有键的列表?

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

如何遍历所有键?

使用公认的答案:

for k, _ := range m  ... 

【讨论】:

我认为您的意思是 for _, k := range v.MapKeys(),因为在您的示例中,k 将是键切片的 int 索引【参考方案4】:

这里有一些简单的方法来获取地图键的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 您需要更改函数“原型” @ArielM。这只适用于确切的类型map[interface]interface。 Go 不支持泛型。您不能创建带有 map 参数的函数,该参数接受具有不同键类型的映射。

以上是关于遍历地图的所有键的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSTL 循环遍历地图 [重复]

小写所有 HashMap 键

根据其键的子集过滤地图的元素,而无需遍历整个事物

C++:遍历地图

如何从地图中提取键?

查找地图中的最大值