go语言defer语句
一、基本介绍
延时机制,在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时释放资源,Go的设计者提供defer
二、案例说明
package main
import (
"fmt"
)
func sum(a, b int) int {
defer fmt.Println("ok1 a=", a)
defer fmt.Println("ok2 b=", b)
result := a + b
fmt.Println("ok3 result=", result)
return result
}
func main() {
sum := sum(10, 20)
fmt.Println("ok4 sum=", sum)
}
输出结果
ok3 result= 30
ok2 b= 20
ok1 a= 10
ok4 sum= 30
代码说明:
- 当执行defer时,暂时不执行,会将defer后面的语句压入到独立的栈(后面对这个独立的栈称为defer栈)
- 当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行
三、注意细节
- 当go执行到一个defer时,不会立即执行defer后面的语句,而是将defer后的语句压入到一个栈中,然后继续执行函数下一个语句
- 当函数执行完毕后,在从defer栈中,一次从栈顶取出语句执行,(注:遵守先入后出的机制)
- 在defer将语句压入到栈时,也会将相关的值拷贝同时入栈。
package main
import (
"fmt"
)
func sum(a, b int) int {
defer fmt.Println("ok1 a=", a)
defer fmt.Println("ok2 b=", b)
a++
b++
result := a + b
fmt.Println("ok3 result=", result)
return result
}
func main() {
sum := sum(10, 20)
fmt.Println("ok4 sum=", sum)
}
输出结果:
ok3 result= 32
ok2 b= 20
ok1 a= 10
ok4 sum= 32
四、编程应用
- 在golang编程中的通常做法是,创建资源后(比如:打开了文件,获取了数据库链接,或者是锁资源,可以执行defer file.Close()、defer connect.Close()、
- 在defer后,可以继续使用资源
- 当函数执行完毕后,系统会依次从defer栈中,取出语句,关闭资源
- 这种机制,非常简洁,程序员不用再为什么时候关闭资源而烦心