为什么打印时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)

    }

}

上面的go代码仅打印一次map [string] string三次。


我希望它具有固定的输出,但它显示如下:


map[key3:value3 key2:value2 key1:value1]

map[key1:value1 key3:value3 key2:value2]

map[key2:value2 key1:value1 key3:value3]

变了!


而在python中:


#!/bin/env python

#encoding=utf8


sample = {

    "key1":"value1",

    "key2":"value2",

    "key3":"value3",

}

for i in range(3):

    print sample

输出:


{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}

{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}

{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}`


阿波罗的战车
浏览 225回答 3
3回答

白猪掌柜的

您不能依靠获得密钥的顺序。语言规范说“映射是一组无序的元素”,后来又说“未指定映射的迭代顺序,并且不能保证每次迭代之间都相同。”

ibeautiful

是的,它是变化的,甚至是有意的(未经修改的地图的迭代之前一直很稳定)。目的是尽早发现有人错误地假设了稳定的迭代保证的情况。此外,由于增加了实现地图的自由度,因此可以对运行时库的该部分进行更多的将来优化。

湖上湖

Python不保证迭代的顺序,但是只要您不修改两次调用之间的字典,它就可以保证顺序保持稳定:If items(), keys(), values(), iteritems(), iterkeys(), and itervalues() arecalled with no intervening modifications to the dictionary, the lists will&nbsp;directly correspond.Go也不保证。从您的示例中可以看出,Go中的顺序可能是稳定的,只是起点有所不同,但是由于没有任何保证,因此请不要依赖它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go