2016-05-31 108 views
0

我在goroutine內部基於迭代變量i進行了一些條件檢查,發現它給了我不期望的結果,我決定用一些簡單的方法來確認它碼。使用goroutine迭代給出了意想不到的結果

for i := 1; i <= 5; i++ { 
    wg.Add(1) 
    fmt.Println(i) 

    go func() { 
     fmt.Println(i) 
     wg.Done() 
    }() 


} 
wg.Wait() 

1 
2 
3 
4 
5 
6 
6 
6 
6 
6 

這是預期的行爲嗎?有人可以解釋爲什麼6次被打印5次,但我只是迭代到5?

+1

另請參閱常見問題解答:https://golang.org/doc/faq#closures_and_goroutines – JimB

+0

也許更確切的重複:http://stackoverflow.com/questions/36776315/go-concurrency-with-for-loop-和 - 匿名函數 - 意外地行爲 – JimB

+0

沒有必要只有6,6,6,6。增加我的價值。你會得到不同的價值。您在執行goroutine時獲得了i的價值。 – khrm

回答

5

Playground example

所有你夠程都你的for循環結束後異步運行

在你的for循環i到底是等於6,因此,你夠程每個日誌數6

要解決,你可以創建一個封閉的問題,裏面保存的i當前值這樣當goroutine運行時,它將以適當的值i運行。

要做到這一點只是改變你的代碼,以便它看起來像

go func(x int) { 
    fmt.Println(x) 
    wg.Done() 
}(i) // <--- "save" value of i at this point in time. 

這樣,你的「保存」的i函數內部的價值你告訴夠程來執行,使得以後,當爲循環已經運行完成,它不使用當前的i這是6;相反,它在創建goroutine時使用舊的i

相關問題