1 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
可視化正在發(fā)生的事情的最簡單方法是將函數(shù)的輸出更改為:
newElem(func(v int) { fmt.Printf("plus %d - %d+%d\n", i+v, i, v) })
newElem(func(v int) { fmt.Printf("times %d - %d*%d\n", i*v, i , v) })
通過此更改,輸出變?yōu)椋?/p>
plus 3 - 3+0
times 3 - 3*1
plus 5 - 3+2
times 9 - 3*3
plus 7 - 3+4
times 15 - 3*5
因此,如您所見,i在所有情況下都是 3。這是因?yàn)槟趪@i變量創(chuàng)建閉包,因此函數(shù)將使用i它們運(yùn)行時(shí)的當(dāng)前值,即函數(shù)實(shí)際使用時(shí)的 3 i。
如果您像下面這樣更改代碼,您可以再次看到這一點(diǎn):
http://play.golang.org/p/FRhr0n2oi7
i := i循環(huán)內(nèi)部的賦值解決了這個(gè)問題的原因是因?yàn)槟鉯在循環(huán)的范圍內(nèi)創(chuàng)建了一個(gè)新變量,該變量仍然被函數(shù)關(guān)閉,但永遠(yuǎn)不會改變。循環(huán)的每次新迭代都會創(chuàng)建一個(gè)新的,i因此以前不會i更改值。
盡管本文檔描述了處理 goroutines 和閉包時(shí)的一個(gè)常見錯(cuò)誤,但它應(yīng)該對問題和潛在的解決方案有更多的了解。
https://github.com/golang/go/wiki/CommonMistakes
- 1 回答
- 0 關(guān)注
- 191 瀏覽
添加回答
舉報(bào)