Dictionary 使用范围时,GO是否总是以相同的顺序迭代映射项?

Dictionary 使用范围时,GO是否总是以相同的顺序迭代映射项?,dictionary,go,range,Dictionary,Go,Range,此代码是否始终显示相同的结果? 潜在问题: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) } 答案是:没有 我编写了以下测试来断言这一点 func Test_GO_Map_Range(t *testing.

此代码是否始终显示相同的结果? 潜在问题: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)
}
答案是:没有

我编写了以下测试来断言这一点

func Test_GO_Map_Range(t *testing.T) {
    originalMap := map[string]int {
        "a": 1,
        "b": 2,
        "c": 3,
        "d": 4,
        "e": 5,
        "f": 6,
    }
    getKeys := func(m map[string]int) []string{
        mapKeys := make([]string, len(m))
        i := 0
        for n := range m {
            mapKeys[i] = n
            i++
        }
        return mapKeys
    }
    keys := getKeys(originalMap)
    for i := 0; i < 5; i++ {
        assert.Equal(t, keys, getKeys(originalMap))
    }
}

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

迭代顺序

使用范围循环在映射上迭代时,不会指定迭代顺序,也不能保证从一次迭代到下一次迭代的顺序相同。自从Go 1.0发布以来,运行时已经随机映射了迭代顺序。程序员已经开始依赖Go早期版本的稳定迭代顺序,这在不同的实现中有所不同,导致了可移植性缺陷


获得一致排序的一个简单方法是使用。有趣的问题是,我想说的是,在任何语言中都不应该依赖它,但这是不正确的。显然,在Python中可以依赖它:谢谢您的回答。我也来过accross,它从你链接的文章中窃取了大部分内容。
Error:          Not equal: 
                expected: []string{"d", "e", "f", "a", "b", "c"}
                actual  : []string{"a", "b", "c", "d", "e", "f"}

Error:          Not equal: 
                expected: []string{"d", "e", "f", "a", "b", "c"}
                actual  : []string{"f", "a", "b", "c", "d", "e"}

Error:          Not equal: 
                expected: []string{"d", "e", "f", "a", "b", "c"}
                actual  : []string{"c", "d", "e", "f", "a", "b"}

Error:          Not equal: 
                expected: []string{"d", "e", "f", "a", "b", "c"}
                actual  : []string{"b", "c", "d", "e", "f", "a"}

Error:          Not equal: 
                expected: []string{"d", "e", "f", "a", "b", "c"}
                actual  : []string{"a", "b", "c", "d", "e", "f"}