标准答案
- defer 按后进先出执行,参数通常在 defer 声明时求值,闭包要注意变量捕获。
- panic 不能跨 goroutine 被另一个 goroutine recover,边界需要各自保护。
- HTTP 或任务 worker 可以在顶层 recover 做隔离、日志和失败状态,但不应吞掉错误继续复用损坏状态。
- 普通校验失败、依赖失败和用户冲突应使用 error 返回。
题目解析
defer 适合释放资源和记录收尾,panic 表示当前 goroutine 无法按正常路径继续,recover 只能在同一 goroutine 的 defer 中捕获。可预期的校验、依赖和业务失败应返回 error。
HTTP 或 worker 入口可以 recover 做隔离、日志和失败状态,但 recover 不会回滚数据库、撤销外部调用或修复共享状态。异常任务要进入可查询的失败/重试路径。
defer 按后进先出执行,闭包和命名返回值会影响最终结果。恢复逻辑要有界,不能在不确定状态下继续处理同一请求。
常见误区
- 误区:所有错误都 panic。改正:业务和依赖失败返回 error,panic 只用于不可继续的程序状态。
- 误区:在父 goroutine recover 捕获子 goroutine。改正:每个 goroutine 在自己的入口设置 defer/recover,或让错误通过任务组传播。
- 误区:recover 后继续使用不确定状态。改正:终止当前请求/任务,记录状态并通过补偿或重启恢复。