Golang 的 defer 是如何工作的?

Go语言的defer语句工作方式如下:
一、定义
defer语句会将函数调用延迟到外层函数返回。
语法格式为:

defer func1()
defer func2(a, b)

只有在函数退出时才会执行被延迟的函数调用。

二、栈结构
defer语句使用栈结构来保存和调用函数。

  • defer语句产生一个栈帧
  • 多个defer会形成多个栈帧
  • 函数返回时,按栈方式出栈调用函数

这意味着:

  • 后defer的先出栈
  • 先defer的后执行

三、实例

func main() {
   defer fmt.Println(1)  
   defer fmt.Println(2)
   fmt.Println(3)
}

// 输出:
// 3
// 2
// 1

四、应用场景
defer主要用于资源释放,例如:

  • 关闭文件
  • 释放锁
  • 关闭数据库 等等

总的来说,defer 的工作原理为:

  1. 使用栈结构保存函数
  2. 多条defer形成多个栈帧
  3. 函数返回时,按栈方式出栈执行函数
  4. 常用于资源释放

通过这种方式,可以保证函数运行完毕后,资源总可以被正确释放。它的使用可以简化代码,减少错误。