在以下代碼段中,我創建了一個功能列表,按照我的觀察方式,該功能列表應包含打印數字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]() }}但是,所有函數flist均相同main.main.func1,輸出為3 3 3即使i在循環中永遠不會達到值3。這會讓我覺得func只是簡單地使用的地址i,每次都創建相同的func,但是i當以后調用func時,這超出了范圍。我在這里想念什么?
1 回答

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
如果我們考慮為這些函數生成什么代碼,則確實是相同的:每次都使用相同的變量。即使i在循環后超出范圍,它仍會成為閉包的一部分,并且在閉包運行時,它的最新值會被該函數查看。循環退出時,它是3。如果要將閉包綁定到特定值并防止其進一步更改,則可以創建一個狹窄范圍的變量,如下所示:
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 關注
- 346 瀏覽
添加回答
舉報
0/150
提交
取消