Go 语言中 defer 使用时有哪些陷阱?

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。
01 介绍
defer 的使用方式是在其后紧跟一个函数调用或方法调用,确保在其所在的函数体返回之前执行其调用的函数或方法。
在 Go 语言中,defer 一般用于资源释放,或使用 defer 调用一个匿名函数,在匿名函数中使用 recover() 处理异常 panic。
在使用 defer 时,也很容易遇到陷阱,本文我们介绍使用 defer 时有哪些陷阱。
02  defer 陷阱
defer 语句不可以在 return 语句之后。
示例代码:
  1. func main() {
  2.         name := GetUserName("phper")
  3.         fmt.Printf("name:%s\n", name)
  4.         if name != "gopher" {
  5.                 return
  6.         }
  7.         defer fmt.Println("this is a defer call")
  8. }
  9. func GetUserName(name string) string {
  10.         return name
  11. }
复制代码
输出结果:
  1. name:phper
复制代码
阅读上面这段代码,我们在 return 语句之后执行 defer 语句,通过输出结果可以发现 defer 语句调用未执行。
虽然 defer 可以在函数体中的任意位置,我们也是需要特别注意使用 defer 的位置是否可以执行。
defer 语句执行匿名函数,参数预处理。
示例代码:
  1. func main() {
  2.         var count int64
  3.         defer func(data int64) {
  4.                 fmt.Println("defer:", data)
  5.         }(count + 1)
  6.         count = 100
  7.         fmt.Println("main:", count)
  8. }
复制代码
输出结果:
  1. main: 100
  2. defer: 1
复制代码
阅读上面这段代码,首先我们定义一个类型为 int64 的变量 count,然后使用 defer 语句执行一个匿名函数,匿名函数传递参数为 count + 1,最终 main 函数输出 100,defer 执行的匿名函数输出 1。
因为在执行 defer 语句时,执行了 count + 1,并先将其存储,等到 defer 所在的函数体 main 执行完,再执行 defer 语句调用的匿名函数的函数体中的代码。
03 总结
本文主要介绍在使用 defer 语句时可能会遇到的陷阱。分别是 defer 语句不可以在 return 语句之后;defer 语句执行的匿名函数,匿名函数的参数会被预先处理。
读者朋友们在使用 Go 语言的 defer 语句时,还遇到过哪些陷阱?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表