2015-10-06 33 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

相關問題