Go defer 关键字

发布时间 2023-06-12 10:46:07作者: CloverYou

在函数中,我们经常需要创建资源,比如:连接数据库、文件句柄、锁...为了在函数执行完毕后及时释放资源,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