【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区域的值

心得体会

  1. 由于defer语句延迟调用的特性,所以defer语句能非常方便的处理资源释放问题。比如:资源清理、文件关闭、解锁及记录时间等。
  2. 一个函数内可以有多个defer语句,多个defer语句按照先进后出原则执行
经验分享 程序员 微信小程序 职场和发展