在以下代碼段中,我創(chuàng)建了一個(gè)功能列表,按照我的觀察方式,該功能列表應(yīng)包含打印數(shù)字0 1 2的功能。package mainimport "fmt"func main() { flist := make([]func(), 0) for i := 0; i < 3; i++ { flist = append(flist, func() { fmt.Printf("%d ", i) }) } for j := 0; j < 3; j++ { flist[j]() }}但是,所有函數(shù)flist均相同main.main.func1,輸出為3 3 3即使i在循環(huán)中永遠(yuǎn)不會達(dá)到值3。這會讓我覺得func只是簡單地使用的地址i,每次都創(chuàng)建相同的func,但是i當(dāng)以后調(diào)用func時(shí),這超出了范圍。我在這里想念什么?
1 回答

吃雞游戲
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果我們考慮為這些函數(shù)生成什么代碼,則確實(shí)是相同的:每次都使用相同的變量。即使i在循環(huán)后超出范圍,它仍會成為閉包的一部分,并且在閉包運(yùn)行時(shí),它的最新值會被該函數(shù)查看。循環(huán)退出時(shí),它是3。如果要將閉包綁定到特定值并防止其進(jìn)一步更改,則可以創(chuàng)建一個(gè)狹窄范圍的變量,如下所示:
package main
import "fmt"
func main() {
flist := make([]func(), 0)
for i := 0; i < 3; i++ {
j := i // a different variable for each iteration
flist = append(flist, func() { fmt.Printf("%d ", j) })
}
for j := 0; j < 3; j++ {
flist[j]()
}
}
- 1 回答
- 0 關(guān)注
- 355 瀏覽
添加回答
舉報(bào)
0/150
提交
取消