标准答案
- 在大循环中 defer Close 可能等到整个函数结束,应把单次工作放入子函数或显式关闭。
- 多个 defer 按后进先出执行,释放顺序应与资源依赖一致。
- defer 闭包可以修改命名返回值,需避免隐藏错误和控制流。
- 文件、连接、锁和 trace span 都要确认 defer 的作用域足够短。
题目解析
defer 的执行点是当前函数返回,不是循环迭代结束,因此循环中大量 defer 可能让文件、连接和锁长期持有。可以把每次迭代放入子函数或在边界明确关闭。
多个 defer 按后进先出执行,释放顺序应匹配资源依赖。只有成功 Lock 后才能 defer Unlock,关闭错误要与主业务错误合并而不是无条件覆盖。
命名返回值会被 defer 闭包修改,适合少量明确的收尾逻辑,不应让资源清理隐藏主流程和错误优先级。
常见误区
- 误区:循环中 defer 打开数万个文件。改正:缩小函数作用域或显式关闭,控制同时持有的资源数。
- 误区:defer Unlock 放在未成功 Lock 之前。改正:只有 Lock 成功后才注册解锁。
- 误区:关闭错误无条件覆盖主业务错误。改正:保留主错误并附加关闭错误,按业务决定告警或重试。