按顺序收集值,每个值包含一个映射

新手上路,请多包涵

在代码中循环访问主题函数返回的映射时,键未按顺序出现。

如何让键按顺序排列/对地图进行排序,以便键按顺序排列并且值对应?

这是 代码

原文由 gramme.ninja 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 321
2 个回答

Go 博客:Go maps in action 有很好的解释。

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

这是我修改后的示例代码版本: http ://play.golang.org/p/dvqcGPYy3-

 package main

import (
    "fmt"
    "sort"
)

func main() {
    // To create a map as input
    m := make(map[int]string)
    m[1] = "a"
    m[2] = "c"
    m[0] = "b"

    // To store the keys in slice in sorted order
    keys := make([]int, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    sort.Ints(keys)

    // To perform the opertion you want
    for _, k := range keys {
        fmt.Println("Key:", k, "Value:", m[k])
    }
}

输出:

 Key: 0 Value: b
Key: 1 Value: a
Key: 2 Value: c

原文由 Mingyu 发布,翻译遵循 CC BY-SA 4.0 许可协议

这里的所有答案现在都包含地图的旧行为。 在 Go 1.12+ 中,你可以只打印一个映射值,它会自动按键排序。 添加此选项是因为它允许轻松测试映射值。

 func main() {
    m := map[int]int{3: 5, 2: 4, 1: 3}
    fmt.Println(m)

    // In Go 1.12+
    // Output: map[1:3 2:4 3:5]

    // Before Go 1.12 (the order was undefined)
    // map[3:5 2:4 1:3]
}

地图现在以键排序的顺序打印,以便于测试。排序规则是:

  • 适用时,零比较低
  • 整数、浮点数和字符串按 < 排序
  • NaN 比较小于非 NaN 浮点数
  • bool 在 true 之前比较 false
  • 复比实,再比虚
  • 指针按机器地址比较
  • 通道值按机器地址比较
  • 结构依次比较每个字段
  • 数组依次比较每个元素
  • 接口值首先通过描述具体类型的 reflect.Type 进行比较,然后通过前面规则中描述的具体值进行比较。

打印地图时,像 NaN 这样的非自反键值以前显示为 <nil> 。从这个版本开始,打印了正确的值。

在这里 阅读更多

原文由 Inanc Gumus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题