今天寫代碼的時(shí)候用到了協(xié)程go func
,發(fā)現(xiàn)func函數(shù)塊內(nèi)部的代碼也能使用外部的局部變量,當(dāng)時(shí)我就加上了打印發(fā)現(xiàn)閉包內(nèi)部的變量值和外部的局部變量是一樣的,就覺(jué)得很費(fèi)解匿名函數(shù)的傳參是什么用的?
然后我就做了個(gè)小實(shí)驗(yàn),運(yùn)行如下代碼
func main() {
i := 1
go func() {
time.Sleep(100*time.Millisecond)
fmt.Println("i =", i)
} ()
i++
time.Sleep(1000*time.Millisecond)
}
打印如下
i= 2
Process finished with exit code 0
這就說(shuō)明了閉包內(nèi)取外部函數(shù)的參數(shù)的時(shí)候是取的地址,而不是調(diào)用閉包時(shí)刻的參數(shù)值.我們通過(guò)如下代碼驗(yàn)證我們的想法:
func main() {
i := 1
go func(i int) {
time.Sleep(100*time.Millisecond)
fmt.Println("i =", i)
} (i)
i++
time.Sleep(1000*time.Millisecond)
}
輸出為:
i = 1
Process finished with exit code 0
所以我們?cè)谑褂?code>go func的時(shí)候最好把可能改變的值通過(guò)值傳遞的方式傳入到閉包之中,避免在協(xié)程運(yùn)行的時(shí)候參數(shù)值改變導(dǎo)致結(jié)果不可預(yù)期