Go 的 defer、panic 与 recover
Go 用 defer 管理退出时清理,用 panic 表达不可继续的异常状态,用 recover 在受控边界兜底恢复。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
Go 的 defer、panic 与 recover
一句话定义
defer、panic、recover 是 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上下文里生效