go語言迴圈變數
阿新 • • 發佈:2020-09-11
閱讀go語言聖經第五章第六節介紹到了捕獲迭代變數
package main import ( "fmt" ) func main() { var lis []func() for i := 0; i < 10; i++ { lis = append(lis, func() { fmt.Println(i) }) } for _, f := range lis { f() } }
這段程式碼執行結果是列印了10個10
出現這個結果的原因是for迴圈的迴圈體會共享迴圈變數i的值,因此第二個for迴圈開始呼叫f函式時,他們的i共享的是最後一次的迴圈變數i的值,此時i已經變成了10。
如何確保函式列印迴圈到某一時刻的i值呢?
package main import ( "fmt" ) func main() { var lis []func() for i := 0; i < 10; i++ { i := i lis = append(lis, func() { fmt.Println(i) }) } for _, f := range lis { f() } }
以上程式碼實現該效果。我的理解是:i:=0;i<10;i++是一個詞法塊,它是for迴圈體的上一級作用域,原來的for迴圈體找i是從上級作用域找到的。所以,只要我們能讓for迴圈體找i時從自己的作用域找就可以了,因此,我們需要在迴圈體內重新宣告一個變數儲存上級作用域中的i在當前迴圈的值。這裡我宣告的變數還是i(go語言聖經也用原變數名,應該是讓讀者記憶更深刻吧)