golang中闭包讲解
1. 非闭包时的结果
package main import "fmt" func main() { var funcSlice []func() for i := 0; i < 5; i++ { // 此处匿名函数创建了,但是匿名函数中的内容根本没有执行 f := func() { fmt.Println(i) } funcSlice = append(funcSlice, f) } // 为什么输出都是5? // 因为匿名函数内部的代码for循环时不会执行,只有当下面调用匿名函数时才会执行,而且for循环退出条件是i=5时退出 // 所有输出都是5 funcSlice[0]() funcSlice[1]() funcSlice[2]() }
2. 使用闭包时的结果
package main import "fmt" func main() { var funcSlice []func() for i := 0; i < 5; i++ { // 此处匿名函数创建了,但是匿名函数中的内容根本没有执行 f := func(n1 int) func() { return func() { fmt.Println(n1) } }(i) funcSlice = append(funcSlice, f) } // 闭包:外函数的返回值是内函数的引用,内函数用到了外函数的临时变量 // 为什么输出都是0、1、2 // 因为for循环时,i已经值拷贝到n1里面去了,f执行的匿名函数中的n1与i已经没有关系了 // f变量指向的是func里面包裹的func匿名函数 // 所以输出是0、1、2 funcSlice[0]() funcSlice[1]() funcSlice[2]() }