Go语言学习之defer

134 阅读1分钟

作用

延迟执行语句

在函数其他语句执行完时,才会开始运行defer语句。

不管函数是正常执行完,或者遇到return,还是发生panic错误,只要defer在发生之前,都会执行。

用法

只能在函数内使用。

defer 后面跟上 语句

func deferTest() {
   f, err := os.Open("filename")
   if err != nil {
      fmt.Println("文件打开错误")
      return
   }
   //如果文件打开成功,运行到这里,等函数运行结果,会自动执行close()
   defer f.Close()
   //....其他文件操作
   fmt.Println(f.Name())
}

执行顺序

defer的执行顺序可以看做一个栈,先添加的defer的在栈底,最后添加defer的在栈顶。

示例:

func deferTest() {
   fmt.Println("开始执行函数。。。。")

   defer fmt.Println("函数已执行完毕,开始执行defer,这是第1个defer")
   defer fmt.Println("函数已执行完毕,开始执行defer,这是第2个defer")
   defer fmt.Println("函数已执行完毕,开始执行defer,这是第3个defer")
   
   fmt.Println("函数执行完毕。。。。")
}

运行结果:

开始执行函数。。。。

函数执行完毕。。。。

函数已执行完毕,开始执行defer,这是第3defer

函数已执行完毕,开始执行defer,这是第2defer

函数已执行完毕,开始执行defer,这是第1defer

从结果可以看到,最后的defer最先执行,第一个defer最后执行。

使用场景

常用来函数执行完时,释放资源。

比如打开文件后关闭文件,使用并发时加锁后解锁。