Go 语言 defer 执行顺序与常见陷阱
【摘要】 介绍 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 赋值之后执行,可以修改命名返回值。
常见陷阱
- 循环中大量 defer 会延迟到函数结束才释放,应抽成子函数。
- defer 文件 Close 时应检查错误。
总结
掌握后进先出、参数预求值、与命名返回值交互三点,就能正确使用 defer。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)