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




Go语言的defer原理

Go 语言中的 defer 语句用于延迟一个函数或方法的执行,直到包含该 defer 语句的函数执行完毕时,才会执行被延迟的函数。其原理和工作机制可以总结如下:

1. 栈结构管理:

  1. Go 使用一个称为 defer 栈(或称为延迟栈)的数据结构来管理所有的 defer 语句。

  2. 当一个 defer 语句被执行时,它会将延迟的函数调用信息(包括函数指针、参数等)压入到 defer 栈中。

2. 后进先出(LIFO)原则:

  1. defer 栈遵循后进先出的原则,即最后压入的 defer 语句会最先被执行。

  2. 这意味着在同一个作用域内,如果你有多个 defer 语句,它们会按照相反的顺序执行。

3. 函数返回值的设置:

  1. 在包含 defer 语句的函数即将返回时,Go 会从 defer 栈中依次弹出延迟的函数调用并执行它们。

  2. 值得注意的是,defer 语句可以修改命名返回值(named return parameters)。这意味着在函数返回之前,defer 中的代码可以更改已经计算好的返回值。

4. 资源清理和错误处理:

  1. defer 常用于资源清理(如关闭文件、解锁互斥锁)和错误处理(如记录日志、回滚事务)。

  2. 通过使用 defer,可以确保这些清理操作总是会被执行,即使在发生错误时也是如此。

5. 性能开销:

  1. defer 语句在运行时有一定的性能开销,因为它涉及到栈的操作。

  2. 然而,对于大多数应用程序来说,这种开销是可以接受的,并且 defer 带来的代码可读性和可靠性提升通常是值得的。

6. 匿名函数和闭包:

  1. defer 可以与匿名函数或闭包一起使用,这使得在延迟执行时能够捕获和传递额外的上下文信息。

示例代码:

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 函数返回之前被依次执行,并且顺序与它们被声明的顺序相反。







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、付费专栏及课程。

余额充值