Go 的 defer、panic 与 recover

Go 用 defer 管理退出时清理,用 panic 表达不可继续的异常状态,用 recover 在受控边界兜底恢复。

#type / concept #status / growing #tech / dev #resource / go

[!info] related notes

Go 的 defer、panic 与 recover

一句话定义

deferpanicrecover 是 Go 用来处理“函数退出时清理”和“程序异常边界”的一组机制,但它们并不替代常规错误处理。

核心机制 / 工作原理

  • defer:注册一个函数,在当前函数返回前执行
  • panic:让当前控制流进入不可继续状态并向上展开
  • recover:只能在 defer 中拦截当前 goroutine 的 panic

它们各自的角色应该分清:

  • defer 主要用于资源清理
  • panic 主要用于程序不变量被破坏或无法继续执行的场景
  • recover 主要用于框架边界、协程边界或服务兜底

最小例子 / 最小场景

func readFile(path string) error {
    f, err := os.Open(path)
    if err != nil {
        return err
    }
    defer f.Close()

    return nil
}

这就是 defer 最典型的价值:

  • 清理动作紧跟资源申请位置
  • 降低多返回路径下忘记释放资源的概率

为什么这部分重要

很多初学者会把 panic/recover 误当成 Go 版 try/catch。这样做通常会把正常错误路径和系统级异常路径混在一起,反而破坏 Go 代码的可读性。

边界与易混淆点

  • defer 不是异步执行,而是在当前函数返回前执行
  • panic 不是日常业务错误返回的替代品
  • recover 只能在合适的 defer 上下文里生效
创建于 2026/6/20 更新于 2026/6/20