在下面的代码块中,我希望输出为 0、1、2、3、...、9。但是,只产生了输出 10、10、...、10。
package main
import "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 的当前值?
最佳答案
每次迭代都会创建一个新函数,但它们都关闭相同的变量i
。该变量在每次迭代时都会更新,直到最后一次,因此当您遍历并执行所有这些函数时,它们都引用相同的 i
,具有相同的值,10
.
如果你不想要这种行为,你必须不关闭循环变量:
for i := 0; i < 10; i++ {
temp := i
out = append(out, func() { fmt.Println(temp) })
}
关于function - Golang 闭包不存储捕获的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325372/