Go 语言 defer 执行顺序与常见陷阱

举报
yd_258808623 发表于 2026/11/05 10:15:32 2026/11/05
【摘要】 介绍 Go 语言 defer 的后进先出、参数预求值、与命名返回值的交互及常见陷阱。

背景

Go 的 defer 语句用于延迟函数调用,常用于释放资源。理解它的执行规则可以避免许多隐蔽 bug。

规则一:后进先出

多个 defer 按照声明的逆序执行:

func main() {
    for i := 0; i < 3; i++ {
        defer fmt.Println(i)
    }
}
// 输出 2 1 0

规则二:参数在声明时求值

defer 后的函数参数在 defer 语句执行时就已确定,而不是在函数返回时。

规则三:与命名返回值的交互

func f() (n int) {
    defer func() { n++ }()
    return 1
}
// 返回 2

由于 defer 在 return 赋值之后执行,可以修改命名返回值。

常见陷阱

  1. 循环中大量 defer 会延迟到函数结束才释放,应抽成子函数。
  2. defer 文件 Close 时应检查错误。

总结

掌握后进先出、参数预求值、与命名返回值交互三点,就能正确使用 defer。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。