在下面的代码块中,我希望输出为 0、1、2、3、...、9。但是,只会产生输出 10、10、...、10。package mainimport "fmt"func adder() []func() { out := []func(){} for i := 0; i < 10; i++ { out = append(out, func() { fmt.Println(i) }) } return out}func main() { out := adder() for i := 0; i < 10; i++ { out[i]() }}我的心理模型表明每次在 for 循环中都会生成并存储一个新函数,但事实并非如此。是否有一种解决方案可以在不修改签名(无参数或全局变量)但仍保持 i 的当前值的情况下生成新函数?
1 回答
心有法竹
TA贡献1866条经验 获得超5个赞
每次迭代都会创建一个新函数,但它们都关闭相同的变量i。该变量在每次迭代时都会更新,直到最后一次迭代,因此当您遍历并执行所有这些函数时,它们都引用相同的i,具有相同的值,10。
如果您不想要这种行为,则不得关闭循环变量:
for i := 0; i < 10; i++ {
temp := i
out = append(out, func() { fmt.Println(temp) })
}
- 1 回答
- 0 关注
- 68 浏览
添加回答
举报
0/150
提交
取消