go中的defer在return之前执行,类似于析构函数,一般用在资源清理、关闭连接、释放锁等操作。多个defer的调用顺序和定义顺序相反,和析构函数类似。
闭包的含义:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。由闭包的实质含义,我们可以推论:闭包获取捕获变量相当于引用传递,而非值传递;对于闭包函数捕获的常量和变量,无论闭包何时何处被调用,闭包都可以使用这些常量和变量,而不用关心它们表面上的作用域。
package main
import (
"fmt"
)
func main() {
var fs = [4]func(){}
for i := 0; i < 4; i++ {
//i值拷贝,defer倒序执行,所以先后输出3,2,1,0,跟下面的defer交替执行4次
defer fmt.Println("defer i= ", i)
//执行完下面的代码后执行该defer,匿名函数,也是个闭包,使用外层函数i的引用,所以先输出4,接着执行上面的defer,这样反复执行4次
defer func() { fmt.Println("defer_closure i = ", i) }()
//匿名函数存储到fs中,因为这是个匿名函数,也是个闭包,i是外层函数中i的引用,执行完for后i的值为4,所以输出4个4
fs[i] = func() { fmt.Println("closure i = ", i) }
}
//匿名函数的调用
for _, f := range fs {
f()
}
}
运行结果: