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

Adi*_*ghi 3 dictionary hashmap go

我使用了一个地图,它使用句子中的单词作为键,整数作为值.

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"))
}
Run Code Online (Sandbox Code Playgroud)

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

map[I:1 am:2 learning:3 GO:4 since:5 some:6 days:7]
Run Code Online (Sandbox Code Playgroud)

但如果我改变

count = count + 1
Run Code Online (Sandbox Code Playgroud)

至

count++
Run Code Online (Sandbox Code Playgroud)

输出更改为:

map[learning:3 GO:4 since:5 some:6 days:7 I:1 am:2]
Run Code Online (Sandbox Code Playgroud)

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

icz*_*cza 15

如何更改变量值的方式count与map元素的迭代顺序无关.

没有"正确的"迭代顺序,迭代顺序可以被认为是随机的(并且在当前实现中它是随机的).引用语言规范:语句:

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

有关该主题的更多信息,请查看以下答案:为什么Go不能按插入顺序迭代地图?

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

但是,如果您更改了代码,那么它将被"视为"新代码,它将被编译并运行(并且其输出将在之后缓存).并且由于它重新运行,您可能会观察到一个新的随机顺序 - 您可以执行此操作.

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

有关如何实施Playground的更多信息,请参阅博客文章Inside the Go Playground.

引用相关部分:

当前端收到编译请求时,它首先检查memcache以查看它是否已缓存该源的先前编译的结果.如果找到,则返回缓存的响应.高速缓存阻止流行程序(例如Go主页上的程序)使后端过载.如果没有缓存响应,则前端向后端发出RPC请求,将响应存储在memcache中,解析回放事件,并将JSON对象作为HTTP响应返回给客户端(如上所述).