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

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


如何迭代所有键?

#1 楼

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

评论


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

–mna
2012年9月22日在2:18

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

– Mark Renouf
13年4月28日在15:04

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

–里克·史密斯
2013年12月13日在17:42

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

– woot
18年1月17日在2:41

#2 楼

这是获取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函数是否可以使用任何类型的键而不只是字符串来映射?

– Robert T. McGibbon
2015年2月9日,下午3:32

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

– a8m
2015年2月9日在13:19



@ArielM。这仅适用于确切的类型map [interface {}] interface {}。 Go不支持泛型。您无法使用带有接受不同键类型的映射的map参数创建函数。

–icza
15年6月17日在10:07

#3 楼


是否可以获取Go语言映射中所有键的列表?


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



我该怎么办?遍历所有键?


使用公认的答案:

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


评论


我认为您的意思是_,k:= range v.MapKeys(),因为在您的示例中,k是键片的int索引

–布莱恩·利什曼(Brian Leishman)
19年4月23日在14:05

#4 楼

类型不可知的解决方案:
for _, key := range reflect.ValueOf(yourMap).MapKeys() {
    value := s.MapIndex(key).Interface()
    fmt.Println("Key:", key, "Value:", value)
}  


#5 楼

这也是一个选择
 for key, element := range myMap{
    fmt.Println("Key:", key, "Element:", element)
 }