我正在尝试构建一个包含封闭变量(在本例中为字符串)的函数数组,但我得到了一些意外的输出。我认为我得到此输出的原因是因为附加的 func 文字实际上是指向代码的指针,该代码在每次迭代后都会更改。
有没有办法new()
或make()
一个函数类型,这样append()
会得到一个不同的函数实例改为每次迭代?
package main
import "log"
var functions []func()
func main() {
for _, s := range [...]string{"goodbye", "cruel", "world"} {
functions = append(functions, func() {
log.Println(s)
})
}
for _, f := range functions {
f()
}
}
输出:
2014/11/23 18:13:16 world
2014/11/23 18:13:16 world
2014/11/23 18:13:16 world
最佳答案
循环的每次迭代都使用变量 s
的相同实例,因此每个闭包共享该单个变量。要在启动时将 s
的当前值绑定(bind)到每个闭包,必须修改内部循环以在每次迭代时创建一个新变量。例如,
package main
import "log"
var functions []func()
func main() {
for _, s := range [...]string{"goodbye", "cruel", "world"} {
s := s // create new s
functions = append(functions, func() {
log.Println(s)
})
}
for _, f := range functions {
f()
}
}
输出:
2009/11/10 23:00:00 goodbye 2009/11/10 23:00:00 cruel 2009/11/10 23:00:00 world
引用资料:
关于pointers - 循环中覆盖的封闭变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27096978/