defer 的首要价值是让释放动作靠近申请动作。文件关闭、锁释放、事务回滚,用 defer 往往比手动分支更不容易漏。

但在极高频循环里,defer 可能带来额外开销,也可能把释放时机拖到函数结束。比如批量处理每一行数据时,把 defer 放在循环内部就需要小心。

for rows.Next() {
    if err := handleRow(); err != nil {
        return err
    }
}
return rows.Close()

我的默认策略是:普通业务代码优先可读性,热路径在压测或 pprof 证明有问题后再改。不要凭印象优化,也不要把所有 defer 都手动展开。

工程里真正危险的不是 defer 慢,而是资源释放路径不一致。性能问题可以量化,泄漏问题往往上线后才暴露。

分类: Go 语言笔记 标签: Go defer 性能

评论

-- 评论已关闭 --

全部评论