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

大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。

01 介绍

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

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

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

02  `defer` 陷阱

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

示例代码:

```go
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
}
```

输出结果:

```shell
name:phper
```

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

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

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

示例代码:

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

输出结果:

```shell
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` 语句时,还遇到过哪些陷阱?

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值