Pointers 在循环中重写的封闭变量
我试图构建一个包含封闭变量(在本例中为字符串)的函数数组,但得到了一些意外的输出。我想我得到这个输出的原因是因为被附加的func文本实际上是一个指向每次迭代后被更改的代码的指针 有没有办法Pointers 在循环中重写的封闭变量,pointers,go,Pointers,Go,我试图构建一个包含封闭变量(在本例中为字符串)的函数数组,但得到了一些意外的输出。我想我得到这个输出的原因是因为被附加的func文本实际上是一个指向每次迭代后被更改的代码的指针 有没有办法new()或make()一个函数类型,这样append()每次迭代都会得到不同的函数实例 package main import "log" var functions []func() func main() { for _, s := range [...]string{"goodbye",
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
的当前值绑定到每个闭包,必须修改内部循环以在每次迭代中创建一个新变量。比如说,
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
2009/11/10 23:00:00再见
2009/11/10 23:00:00残忍
2009/11/10 23:00:00世界
参考资料:
很有趣。所以它实际上是迭代器本身的作用域,而不是函数?