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

Go语言defer机制详解与应用

一、defer作用

Go语言的defer关键字提供了一种延迟执行机制,它能确保指定的函数调用在当前函数返回前被执行。这一特性常用于资源释放和异常处理场景。

二、defer基本特性

(1)执行时机:defer 语句会在外层函数返回前执行,无论函数是正常返回还是因 panic 而异常终止。

(2)执行顺序:多个 defer 语句按后进先出(LIFO)的顺序执行,类似于栈的操作方式。

(3)参数求值:defer 语句的参数在注册时就已完成求值,而非执行时才进行计算。

三、defer机制

1)参数绑定时机

defer语句中,参数值会在声明时立即确定。代码示例如下:

func main() {a := 10// 输出10defer fmt.Println("defer a:", a)  a = 20// 输出20fmt.Println("current a:", a)    
}

参数a的值在defer语句出现时就已经固定,运行结果如下:

2)执行顺序

执行顺序遵循后进先出(LIFO)原则,最后注册的defer语句将最先执行。代码示例如下:

func main() {defer fmt.Println("first")defer fmt.Println("second")defer fmt.Println("third")
}

执行如果如下:

3)修改返回值

defer 语句能够修改具名返回值,但对匿名返回值无效。代码示例如下:

func main() {defer fmt.Println(deferFuncReturn())
}func deferFuncReturn() (result int) {i := 1defer func() { result++ }()// 实际返回2return i 
}

执行如果如下:

四、应用场景

1)资源释放

确保正确释放文件、锁等资源。代码示例如下:

file, err := os.Open("test.txt")
if err != nil { return err 
}defer file.Close()

2)锁管理

避免忘记解锁导致的死锁,代码示例如下:

mu.Lock()
defer mu.Unlock()

3)异常恢复

与recover配合捕获panic异常,代码示例如下:

defer func() {if r := recover(); r != nil {fmt.Println("Recovered:", r)}
}()

4)事务处理

确保数据库事务正确提交或回滚,代码示例如下:

tx, err := db.Begin()defer func() {if p := recover(); p != nil {tx.Rollback()}
}()

5)性能监控

记录函数执行时间,代码示例如下:

func doWork() {start := time.Now()defer func() {fmt.Printf("耗时: %v\n", time.Since(start))}()
}

五、defer使用注意事项

1)避免在循环中使用defer,可能导致资源未及时释放。

2)对于高频调用的简单操作,建议手动释放资源而非使用defer

3)os.Exit()等强制退出方式会跳过defer的执行。

4)defer中的错误容易被忽略,需要特别关注错误处理。

http://www.dtcms.com/a/330844.html

相关文章:

  • 机器学习介绍
  • 预训练模型在机器翻译中的应用:迁移学习的优势详解
  • 华为实验WLAN 基础配置随练
  • dkms安装nvidia驱动和多内核支持
  • 【motion】GIF 转mp4及ubuntu的VLC播放
  • 数据结构初阶(14)排序算法—交换排序(冒泡)(动图演示)
  • 基于SpringBoot+Vue的房屋匹配系统(WebSocket实时通讯、协同过滤算法、地图API、Echarts图形化分析)
  • iOS App TestFlight 上架全流程案例,从 0 到 1 完成内测分发
  • C#通过TCP_IP与PLC通信
  • vue部署正式环境上传nginx后遇到的问题
  • 分享10个ai生成ppt网站(附ai生成ppt入口)
  • ZigBee入门与提高(3)—— ZigBee协议初识
  • Wireshark中常见协议
  • 重学JS-002 --- JavaScript算法与数据结构(二)JavaScript 基础知识
  • MFT 在零售行业的实践案例与场景:加速文件集成与业务协作的高效方案
  • day30 TCP通信
  • 财务自动化软件敏感数据泄露风险评估与防护措施
  • B站 韩顺平 笔记 (Day 18)
  • C++ 仿RabbitMQ实现消息队列项目
  • 使用uniapp自定义组件双重支付密码
  • RabbitMQ面试精讲 Day 22:消息模式与最佳实践
  • 8.14网络编程——TCP通信基础
  • 计算机视觉第一课opencv(二)保姆级教
  • WPF 实现TreeView选中项双向绑定保姆级教程:TreeViewHelper深度解析
  • MySQL缓存策略
  • 计算机视觉--opencv(代码详细教程)(二)
  • iPhone 17 系列发布会定于 9 月 9 日举行-邀请函或 9 月 2 日发出
  • MCP Server搭建
  • OpenCV中对图像进行平滑处理的4种方式
  • 微美全息(WIMI.US)借区块链与聚类技术,开启物联网去中心化安全架构新纪元