2015-10-06 31 views
3

我使用了一个使用来自句子的单词作为其键和整数值的地图。为什么count ++(而不是count = count + 1)改变了Golang中地图的返回方式

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")) 
} 

上述代码ALWAYS显示地图以正确的顺序,即

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++要返回地图迭代?

+2

难道你有机会在Go Playground上测试它吗?如果是这样,操场上的输出被缓存! – icza

+0

这是来自golang之旅。此代码中没有任何内容正在使用巡视的任何现有代码。 –

+0

我不是在谈论代码的来源,而在于你在哪里运行/测试它。 – icza

回答

14

您如何更改count变量的值与地图元素的迭代顺序无关。

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

映射上的迭代次序没有指定,并且不能保证从一次迭代到下一次迭代的迭代次数相同。

更多关于这个话题,看看这个答案:Why can't Go iterate maps in insertion order?

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

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

如果您再次更改代码中的某些内容,即使与添加或更改某些注释一样微不足道,输出也会(可能)再次更改,请尝试。

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

引用的相关部分:

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

+0

上跑过,似乎是这样。我在本地编译器上运行它,并在所有情况下都给出了随机输出,无论是使用count = count + 1还是count ++。万分感谢! –

+0

* OT *您的代码看起来不太符合意识。它可以被简化(例如http://play.golang.org/p/E4k2BxQWMV) – tez

相关问题