您是否希望对变量或值进行闭包?例如,
package mainimport "fmt"func VariableLoop() { f := make([]func(), 3) for i := 0; i < 3; i++ { // closure over variable i f[i] = func() { fmt.Println(i) } } fmt.Println("VariableLoop") for _, f := range f { f() }}func ValueLoop() { f := make([]func(), 3) for i := 0; i < 3; i++ { i := i // closure over value of i f[i] = func() { fmt.Println(i) } } fmt.Println("ValueLoop") for _, f := range f { f() }}func VariableRange() { f := make([]func(), 3) for i := range f { // closure over variable i f[i] = func() { fmt.Println(i) } } fmt.Println("VariableRange") for _, f := range f { f() }}func ValueRange() { f := make([]func(), 3) for i := range f { i := i // closure over value of i f[i] = func() { fmt.Println(i) } } fmt.Println("ValueRange") for _, f := range f { f() }}func main() { VariableLoop() ValueLoop() VariableRange() ValueRange()}输出:
可变回路333价值循环01个2可变范围222价值范围01个2
参考文献:
Go编程语言规范
函数文字
函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可以访问它们就可以保留。
常见问题解答:以goroutines身份运行闭包会发生什么?
要将v的当前值绑定到每个闭包启动时,必须修改内部循环以在每次迭代时创建一个新变量。一种方法是将变量作为参数传递给闭包。
甚至更容易的是使用声明样式创建一个新变量,该声明样式可能看起来很奇怪,但在Go中可以正常工作。



