【Golang】go语言defer使用详解
defer的执行顺序
例子:
func main() { fmt.Println("开始") defer fmt.Println(00) defer fmt.Println(01) defer fmt.Println(10) fmt.Println("结束") }
结果:
开始 结束 3 2 1
defer和return
在Go语言的函数中return 语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后,RET指令执行前。具体如下图所示: 例子:
func f2() (x int) { defer func() { x++ }() return 5 } func main(){ fmt.Println(f2()) }
结果: 输出 6
解释: f2()函数命名返回值x。
1.返回值开辟了一块新的内存空间0xcccccc,赋值为x=5
2.运行defer x=6 。同时修改了指向0xccccc的值
3.return 指向0xccccc区域的值
心得体会
- 由于defer语句延迟调用的特性,所以defer语句能非常方便的处理资源释放问题。比如:资源清理、文件关闭、解锁及记录时间等。
- 一个函数内可以有多个defer语句,多个defer语句按照先进后出原则执行
下一篇:
C语言 do while语句的用法