网络语言系列&go系列【仅供参考】:Go的defer原理




Go的defer原理

Go 语言中的 defer 语句用于延迟执行一个函数,直到包含该 defer 语句的函数执行完毕时才执行。defer 主要用于资源清理、文件关闭、解锁互斥锁等操作,以确保这些操作在函数返回前被执行,无论函数是正常返回还是由于错误提前返回。

以下是 defer 的几个关键原理和特性:

1. 栈管理:

  1. defer 语句会将要延迟执行的函数注册到一个称为 defer 栈的数据结构中。

  2. 当外层函数返回时,defer 栈中的函数会按照后进先出的顺序(LIFO,Last In First Out)被依次执行。

2. 参数求值:

  1. defer 语句中的函数参数在 defer 语句执行时立即求值,而不是在延迟的函数实际执行时求值。

  2. 这意味着如果传递给 defer 的参数是变量,那么该变量的值是在 defer 语句执行时捕获的,而不是在函数被实际延迟执行时。

3. 执行时机:

  1. defer 语句中的函数会在包含它的函数返回之前执行。

  2. 这包括正常返回和由于 panic 引发的返回(在 recover 调用之前)。

4. 嵌套 defer:

  1. 可以在一个函数中嵌套多个 defer 语句,这些 defer 语句会按照相反的顺序执行(即后注册的先执行)。

5. 错误处理:

  1. defer 常常与 recover 一起使用,以捕获和处理在 goroutine 中发生的 panic,从而防止整个程序崩溃。

示例代码:

package main
 
import "fmt"
 
func main() {
    fmt.Println("Start")
    defer fmt.Println("Deferred 1")
    defer fmt.Println("Deferred 2")
    fmt.Println("End")
}

输出:

Start
End
Deferred 2
Deferred 1

在这个例子中,defer 语句注册了两个函数,它们分别打印 “Deferred 1” 和 “Deferred 2”。这些函数在 main 函数返回之前按照后进先出的顺序被执行。

通过 defer 机制,Go 语言提供了一种简洁且强大的方式来确保资源被正确释放和清理,从而避免了许多常见的资源泄漏问题。







ac-er8888

Go的defer原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坦笑&&life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值