当前位置: 首页 > article >正文

Go语言的defer原理

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

  1. 栈结构管理
    • Go 使用一个称为 defer 栈(或称为延迟栈)的数据结构来管理所有的 defer 语句。
    • 当一个 defer 语句被执行时,它会将延迟的函数调用信息(包括函数指针、参数等)压入到 defer 栈中。
  2. 后进先出(LIFO)原则
    • defer 栈遵循后进先出的原则,即最后压入的 defer 语句会最先被执行。
    • 这意味着在同一个作用域内,如果你有多个 defer 语句,它们会按照相反的顺序执行。
  3. 函数返回值的设置
    • 在包含 defer 语句的函数即将返回时,Go 会从 defer 栈中依次弹出延迟的函数调用并执行它们。
    • 值得注意的是,defer 语句可以修改命名返回值(named return parameters)。这意味着在函数返回之前,defer 中的代码可以更改已经计算好的返回值。
  4. 资源清理和错误处理
    • defer 常用于资源清理(如关闭文件、解锁互斥锁)和错误处理(如记录日志、回滚事务)。
    • 通过使用 defer,可以确保这些清理操作总是会被执行,即使在发生错误时也是如此。
  5. 性能开销
    • defer 语句在运行时有一定的性能开销,因为它涉及到栈的操作。
    • 然而,对于大多数应用程序来说,这种开销是可以接受的,并且 defer 带来的代码可读性和可靠性提升通常是值得的。
  6. 匿名函数和闭包
    • 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 函数返回之前被依次执行,并且顺序与它们被声明的顺序相反。


http://www.kler.cn/a/453617.html

相关文章:

  • Nmap基础入门及常用命令汇总
  • 运行Zr.Admin项目(后端)
  • 解决:excel鼠标滚动幅度太大如何调节?
  • 云途领航:现代应用架构助力企业转型新篇
  • 重温设计模式--观察者模式
  • LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测
  • 【c语言】字符串与字符数组
  • spring cloud gateway 3
  • Elasticsearch-索引的批量操作
  • CentOS上安装和卸载Docker
  • UE5.3接入电脑USB摄像头实时预览画面
  • sentinel学习笔记7-熔断降级
  • 基于 Python 考研历年国家分数线大数据分析设计与实现
  • 利用Python实现排序算法与Web交互的实验项目
  • 【ARM】PK51关于内存模式的解析与区别
  • Python 端口访问邮件提醒工具
  • AndroidKMP跨平台开发基础1-编译发布
  • AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode和 桔子数据 的 价格对比
  • 解决 Node.js 单线程限制的有效方法
  • ssh免密登录服务器
  • C# Winfrom chart图 实例练习
  • 「Mysql优化大师一」mysql服务性能剖析工具
  • 大模型推理性能优化之KV Cache解读
  • Qt使用QZipWriter和QZipReader来解压、压缩文件
  • MySql B树 B+树
  • 8.zynq编译应用程序