1. 程式人生 > 實用技巧 >go語言迴圈變數

go語言迴圈變數

閱讀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語言聖經也用原變數名,應該是讓讀者記憶更深刻吧)