为什么Go的地图迭代顺序在打印时会有所不同?

Cod*_*for 3 python map go

package main

import "fmt"

func main(){
    sample := map[string]string{
    "key1":"value1",
    "key2":"value2",
    "key3":"value3",
    }
    for i := 0;i<3;i++{
        fmt.Println(sample)
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码只打印了一个map [string]字符串三次.

我希望它是一个固定的输出,但它显示如下:

map[key3:value3 key2:value2 key1:value1]
map[key1:value1 key3:value3 key2:value2]
map[key2:value2 key1:value1 key3:value3]
Run Code Online (Sandbox Code Playgroud)

它有所不同!

而在python中:

#!/bin/env python
#encoding=utf8

sample = {
    "key1":"value1",
    "key2":"value2",
    "key3":"value3",
}
for i in range(3):
    print sample
Run Code Online (Sandbox Code Playgroud)

输出:

{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}`
Run Code Online (Sandbox Code Playgroud)

Tho*_*ler 15

您不能依赖获取密钥的顺序.语言规范 "地图是一组无序的元素",后来"没有指定地图上的迭代顺序,并且不保证从一次迭代到下一次迭代是相同的."


zzz*_*zzz 6

是的,它变化甚至是故意的(未经修改的地图的迭代在之前是稳定的).目的是尽可能早地捕获有人错误地假设稳定迭代保证的情况.此外,随着地图实现的额外自由,将来可能会对运行时库的这一部分进行更多可能的优化.