defer是什么?
在Go语言中,可以使用关键字defer向函数注册退出调用,即主函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。
defer的用途
在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,为了在函数执行完 毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。
defer的执行时机
了解defer的执行时机首先要知道golang的return并非原子操作,return的底层机制如下(例return x):
- 返回值 = x //返回值赋值
- 运行defer //执行defer代码
- RET指令 //执行返回操作
defer常见问题
func f1() int {
x := 5
defer func() {
x++
}()
return x //1.返回值=x=5;2.x++;
}
func f2() (x int) {
defer func() {
x++
}()
return 5 //1.x=5;2.x++
}
func f3() (y int) {
x := 5
defer func() {
x++
}()
return x //1.y=x=5;2.defer x++
}
func f4() (x int) {
defer func(x int) {
x++ //改变x副本
}(x) //参数传递为x副本
return 5 //1.x=5;2.defer
}
func f5() (x int) {
defer func(x *int) {
*x++ //由于引用传值,所以x++
}(&x)
return 5 //1.x=5;2.defer x++
}
func main() {
fmt.Println(f1()) //5
fmt.Println(f2()) //6
fmt.Println(f3()) //5
fmt.Println(f4()) //5
fmt.Println(f5()) //6
}
网友评论