Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 在循环中重写的封闭变量_Pointers_Go - Fatal编程技术网

Pointers 在循环中重写的封闭变量

Pointers 在循环中重写的封闭变量,pointers,go,Pointers,Go,我试图构建一个包含封闭变量(在本例中为字符串)的函数数组,但得到了一些意外的输出。我想我得到这个输出的原因是因为被附加的func文本实际上是一个指向每次迭代后被更改的代码的指针 有没有办法new()或make()一个函数类型,这样append()每次迭代都会得到不同的函数实例 package main import "log" var functions []func() func main() { for _, s := range [...]string{"goodbye",

我试图构建一个包含封闭变量(在本例中为字符串)的函数数组,但得到了一些意外的输出。我想我得到这个输出的原因是因为被附加的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
的当前值绑定到每个闭包,必须修改内部循环以在每次迭代中创建一个新变量。比如说,

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世界 参考资料:


很有趣。所以它实际上是迭代器本身的作用域,而不是函数?