在函数中,我们经常需要创建资源,比如:连接数据库、文件句柄、锁...为了在函数执行完毕后及时释放资源,Go 的设计者提供了一个 defer
关键字,它类似 Java、JavaScript 语言中的 finally
关键字。
func main() {
fmt.Println("01")
defer fmt.Println("02")
fmt.Println("03")
}
这段代码的执行顺序如下所示:
➜ go-learn go run defer.go
01
03
02
一个函数中可以存在多个 defer
,这些 defer
会在最后时刻被先入后出的方式执行。
需要注意一点,defer
执行时是被压入一个栈中,在入栈的时候,如果使用了 值 ,那么该值会被拷贝
func main() {
var num int = 10
fmt.Println("num", num)
num += 1
defer fmt.Println("num1 =", num)
defer fmt.Println("num2 =", num)
num += 1
}
执行以上代码就可以发现这一规则:
➜ go-learn go run defer.go
num 10
num2 = 11
num1 = 11