为什么count ++(而不是count = count + 1)改变了Golang中返回地图的方式

时间:2015-10-06 09:34:13

标签: dictionary go hashmap

我使用的地图使用句子中的单词作为键和整数作为值。

func WordCount(s string) map[string]int {
    var m map[string]int
    m = make(map[string]int)
    var substrings[]string
    count := 0
    substrings = strings.Split(s, " ")
    for i := range substrings {
        count = count + 1
        m[substrings[i]] = count
    }

    return m
}

func main() {   
    fmt.Println(WordCount("I am learning GO since some days"))
}

以上代码始终以正确的顺序显示地图,即

map[I:1 am:2 learning:3 GO:4 since:5 some:6 days:7]

但如果我改变

count = count + 1

count++

输出更改为:

map[learning:3 GO:4 since:5 some:6 days:7 I:1 am:2]

我知道地图迭代在Golang中是随机的,但为什么count = count + 1总是导致地图迭代以与count++相反的有序方式返回?

1 个答案:

答案 0 :(得分:15)

更改count变量值的方式与地图元素的迭代顺序无关。

没有“正确”的迭代顺序,迭代顺序可以被认为是随机的(在当前实现中,随机的)。引自language spec: For statements

  

未指定地图上的迭代顺序,并且不保证从一次迭代到下一次迭代都是相同的。

有关该主题的更多信息,请查看以下答案:Why can't Go iterate maps in insertion order?

The Go Tour使用Go Playground提供代码编辑器和转轮。 Go Playground缓存您在其上运行的代码的输出。运行两次完全相同的代码只会显示缓存的输出。

但是,如果您更改了代码,则将其视为新代码并将其编译并运行(其输出将在之后缓存)。并且由于它重新运行,您可能会观察到一个新的随机顺序 - 您可以这样做。

如果您再次更改代码中的某些内容,即使与添加或更改某些注释无关紧要,输出也会(可能)再次更改,请尝试。

有关如何实施Playground的详细信息,请参阅博文 Inside the Go Playground

引用相关部分:

  

当前端收到编译请求时,它首先检查memcache以查看它是否缓存了该源的先前编译的结果。 如果找到,则返回缓存的响应。缓存可防止Go home page等热门程序过载后端。如果没有缓存响应,则前端向后端发出RPC请求,将响应存储在memcache中,解析回放事件,并将JSON对象作为HTTP响应返回给客户端(如上所述)。 p>

另请注意,从Go 1.12开始,使用fmt包打印时会对地图进行排序(以便于测试),因此现在打印相同的地图将始终按相同顺序列出元素。迭代顺序仍然是故意不确定的。