在使用范围时,GO是否始终以相同的顺序迭代地图条目?

Ade*_*ack 0 dictionary range go

此代码是否始终显示相同的结果?基础问题:将range始终以相同的顺序迭代地图?

m := map[string]int {
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    "e": 5,
    "f": 6,
}
for k, v := range m {
    fmt.Printf("%v = %v", k, v)
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ith 7

不,它是故意随机的(以防止程序员依赖它,因为它没有在语言规范中指定).

来自Go Blog

迭代顺序

当使用范围循环迭代映射时,未指定迭代顺序,并且不保证从一次迭代到下一次迭代是相同的.自Go 1.0发布以来,运行时具有随机化的地图迭代顺序.程序员已经开始依赖早期版本Go的稳定迭代顺序,这在实现之间有所不同,导致可移植性错误.