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

开发 前端
本文主要介绍在使用 defer​ 语句时可能会遇到的陷阱。分别是 defer​ 语句不可以在 return​ 语句之后;defer 语句执行的匿名函数,匿名函数的参数会被预先处理。

01 、介绍

defer 的使用方式是在其后紧跟一个函数调用或方法调用,确保在其所在的函数体返回之前执行其调用的函数或方法。

在 Go 语言中,defer 一般用于资源释放,或使用 defer 调用一个匿名函数,在匿名函数中使用 recover() 处理异常 panic。

在使用 defer 时,也很容易遇到陷阱,本文我们介绍使用 defer 时有哪些陷阱。

02、 defer 陷阱

defer 语句不可以在 return 语句之后。

示例代码:

func main() {
 name := GetUserName("phper")
 fmt.Printf("name:%s\n", name)
 if name != "gopher" {
  return
 }
 defer fmt.Println("this is a defer call")
}

func GetUserName(name string) string {
 return name
}

输出结果:

name:phper

阅读上面这段代码,我们在 return 语句之后执行 defer 语句,通过输出结果可以发现 defer 语句调用未执行。

虽然 defer 可以在函数体中的任意位置,我们也是需要特别注意使用 defer 的位置是否可以执行。

defer 语句执行匿名函数,参数预处理。

示例代码:

func main() {
 var count int64
 defer func(data int64) {
  fmt.Println("defer:", data)
 }(count + 1)
 count = 100
 fmt.Println("main:", count)
}

输出结果:

main: 100
defer: 1

阅读上面这段代码,首先我们定义一个类型为 int64 的变量 count,然后使用 defer 语句执行一个匿名函数,匿名函数传递参数为 count + 1,最终 main 函数输出 100,defer 执行的匿名函数输出 1。

因为在执行 defer 语句时,执行了 count + 1,并先将其存储,等到 defer 所在的函数体 main 执行完,再执行 defer 语句调用的匿名函数的函数体中的代码。

03 、总结

本文主要介绍在使用 defer 语句时可能会遇到的陷阱。分别是 defer 语句不可以在 return 语句之后;defer 语句执行的匿名函数,匿名函数的参数会被预先处理。

读者朋友们在使用 Go 语言的 defer 语句时,还遇到过哪些陷阱?

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2013-06-25 09:52:32

GoGo语言Go编程

2021-06-07 23:19:44

Golang语言 Defer

2024-04-01 00:02:56

Go语言代码

2023-07-03 00:44:26

Go语言MySQL

2021-07-08 23:53:44

Go语言拷贝

2024-05-10 08:36:40

Go语言对象

2023-10-09 07:14:42

panicGo语言

2023-06-26 00:03:55

Go语言类型

2010-08-06 09:25:19

重定向恢复DB2

2014-04-09 09:32:24

Go并发

2023-12-21 07:09:32

Go语言任务

2023-01-12 08:52:50

GoroutinesGo语言

2024-04-07 11:33:02

Go逃逸分析

2021-07-15 23:18:48

Go语言并发

2011-07-14 10:23:33

C语言

2023-01-31 08:48:49

Go语言文件

2022-07-19 12:25:29

Go

2023-07-29 15:03:29

2023-11-30 08:09:02

Go语言

2023-01-30 15:41:10

Channel控制并发
点赞
收藏

51CTO技术栈公众号