Pointers func列表中的Golang funcs取最后一个值

Pointers func列表中的Golang funcs取最后一个值,pointers,go,func,Pointers,Go,Func,在下面的代码段中,我创建了一个func列表,在我看来,该列表应该包含打印数字0 1 2的func package main import "fmt" func main() { flist := make([]func(), 0) for i := 0; i < 3; i++ { flist = append(flist, func() { fmt.Printf("%d ", i) }) } for j := 0; j < 3; j

在下面的代码段中,我创建了一个func列表,在我看来,该列表应该包含打印数字0 1 2的func

package main

import "fmt"

func main() {
    flist := make([]func(), 0)
    for i := 0; i < 3; i++ {
        flist = append(flist, func() { fmt.Printf("%d ", i) })
    }
    for j := 0; j < 3; j++ {
        flist[j]()
    }
}
主程序包
输入“fmt”
func main(){
flist:=make([]func(),0)
对于i:=0;i<3;i++{
flist=append(flist,func(){fmt.Printf(“%d”,i)})
}
对于j:=0;j<3;j++{
flist[j]()
}
}
但是,
flist
中的所有函数都是相同的
main.main.func1
,并且输出是

3

即使
i
在循环中从未达到值3。这会让我觉得func只是取了
i
的地址,每次都创建相同的func,但是当以后调用func时,
i
超出了范围


这里我遗漏了什么?

如果我们考虑一下为这些函数生成了什么代码,它确实是相同的:每次都使用相同的变量。即使
i
在循环之后超出范围,它也会成为闭包的一部分,并且在函数运行时会看到它的最新值。当循环退出时,它是
3
。如果要将闭包绑定到特定值并防止其进一步更改,可以创建一个范围狭窄的变量,如下所示:

package main

import "fmt"

func main() {
    flist := make([]func(), 0)
    for i := 0; i < 3; i++ {
        j := i  // a different variable for each iteration
        flist = append(flist, func() { fmt.Printf("%d ", j) })
    }
    for j := 0; j < 3; j++ {
        flist[j]()
    }
} 
主程序包
输入“fmt”
func main(){
flist:=make([]func(),0)
对于i:=0;i<3;i++{
j:=i//每次迭代使用不同的变量
flist=append(flist,func(){fmt.Printf(“%d”,j)})
}
对于j:=0;j<3;j++{
flist[j]()
}
}