在以下代码段中,我创建了一个功能列表,按照我的观察方式,该功能列表应包含打印数字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 关注
- 320 浏览
添加回答
举报
0/150
提交
取消