标准答案

  1. 在大循环中 defer Close 可能等到整个函数结束,应把单次工作放入子函数或显式关闭。
  2. 多个 defer 按后进先出执行,释放顺序应与资源依赖一致。
  3. defer 闭包可以修改命名返回值,需避免隐藏错误和控制流。
  4. 文件、连接、锁和 trace span 都要确认 defer 的作用域足够短。

题目解析

defer 的执行点是当前函数返回,不是循环迭代结束,因此循环中大量 defer 可能让文件、连接和锁长期持有。可以把每次迭代放入子函数或在边界明确关闭。

多个 defer 按后进先出执行,释放顺序应匹配资源依赖。只有成功 Lock 后才能 defer Unlock,关闭错误要与主业务错误合并而不是无条件覆盖。

命名返回值会被 defer 闭包修改,适合少量明确的收尾逻辑,不应让资源清理隐藏主流程和错误优先级。

常见误区

  • 误区:循环中 defer 打开数万个文件。改正:缩小函数作用域或显式关闭,控制同时持有的资源数。
  • 误区:defer Unlock 放在未成功 Lock 之前。改正:只有 Lock 成功后才注册解锁。
  • 误区:关闭错误无条件覆盖主业务错误。改正:保留主错误并附加关闭错误,按业务决定告警或重试。

作者信息