golang defer关键字
defer关键字的作用
defer 会在当前函数或者方法返回(return)之前执行传入的函数。它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。
在go语言中,程序有defer语句并不会马上执行,而是会进入一个栈,函数return前,会按先进后出的顺序执行。也说是说最先被定义的defer语句最后执行。先进后出的原因是后面定义的函数可能会依赖前面的资源,自然要先执行;否则,如果前面先执行,那后面函数的依赖就没有了。
遇到defer关键字,会将后面的代码语句压入栈中,也会将相关的值同时拷贝入栈中,不会随着函数后面的变化而变化。
defer触发的时机:
- 所在函数return时。
- 所在函数执行结束时。
- 所在goroutine发生恐慌(panic)时。
package main
import (
"fmt"
)
func main() {
fmt.Println(testSum(20, 30))
}
func testSum(num1 int, num2 int) int {
defer fmt.Printf("num1的值为:%v\n", num1) //最先进入栈中,按照栈的特性,先进后出,retrun之前最后输出
defer fmt.Printf("num2的值为:%v\n", num2) //最后进入栈中,按照栈的特性,先进后出,retrun之前最先输出
num1 += 10
num2 += 10
var sum int
sum = num1 + num2
fmt.Printf("sum的值为:%v\n", sum) //先输出
return sum //testSum中最后返回
}
执行结果
sum的值为:70
num2的值为:30
num1的值为:20
70

浙公网安备 33010602011771号