Go - 多次在同一个订单上循环浏览地图

时间:2015-06-20 18:01:28

标签: go

如何多次循环一个常量顺序的地图?

在我的go代码中,我循环遍历地图两次,但两个循环上的值没有出现在相同的顺序上:

fieldMap := map[string]int{...}

第一循环:

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

第二次循环:

for _, v := range fieldMap {...}

2 个答案:

答案 0 :(得分:4)

将键保存在第一个循环中并在第二个循环中使用它们:

keys := make([]string, 0, len(m))
for k, v := range m {
    fmt.Println(k, v)
    keys = append(keys, k)
}
for _, k := range keys {
    fmt.Println(k, m[k])
}

游乐场:http://play.golang.org/p/MstH20wkNN

答案 1 :(得分:4)

Go确保您不能依赖此博文https://blog.golang.org/go-maps-in-action#TOC_7中所述的地图订单。

  

当使用范围循环迭代映射时,未指定迭代顺序,并且不保证从一次迭代到下一次迭代是相同的。由于Go 1,运行时随机化地图迭代顺序,因为程序员依赖于先前实现的稳定迭代顺序。如果需要稳定的迭代顺序,则必须维护一个指定该顺序的单独数据结构。

Ainar-G的回答是正确的,但这里有一个变体,同时纳入了这个答案...... https://stackoverflow.com/a/27848197/3536948

keys := make([]string, len(m))
i := 0
for k, _ := range m {
    keys[i] = k
    i += 1
}
for _, k := range keys {
    fmt.Println(m[k])
}

游乐场:http://play.golang.org/p/64onPZNODm