package main
import "fmt"
func main() {
var fs = [4]func(){}
for i := 0; i < 4; i++ {
defer fmt.Println("defer i = ", i)
defer func() {
fmt.Println("defer_closure i = ", i)
}()
fs[i] = func() {
fmt.Println("closure i= ", i)
}
}
for _, f := range fs {
f()
}
}
以上程序输出结果:
closure i= 4
closure i= 4
closure i= 4
closure i= 4
defer_closure i = 4
defer i = 3
defer_closure i = 4
defer i = 2
defer_closure i = 4
defer i = 1
defer_closure i = 4
defer i = 0
解析:
1. (闭包)fs[i] 中的匿名函数(且没有参数)中的 i变量未定义 则从外层函数获取for函数 i变量 的引用地址;最终i 的值在for函数执行完时为4;
defer:在函数体执行结束后按照调用顺序的相反顺序逐个执行
2. defer 的规则是先调用的后执行 所以第二个defer的函数先执行 由于函数为闭包函数 所以i 打印的值也为4; 第一个defer 函数不是匿名闭包函数,所以 i 作为正常int型函数参数,为值传递 (3,2,1,0)