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]()
}

浙公网安备 33010602011771号