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

defer关键字:延迟调用机制-《Go语言实战指南》

defer 是 Go 语言中用于延迟执行函数调用的关键字。它广泛用于资源释放、异常捕获、日志记录等场景,是构建健壮代码的利器。


一、基本语法

defer 函数调用
  • • defer 语句会推迟函数的执行,直到包含它的函数执行完毕。
  • • 多个 defer 会以栈的方式后进先出(LIFO)执行。
示例:
func test() {defer fmt.Println("A")defer fmt.Println("B")fmt.Println("C")
}test()
// 输出:
// C
// B
// A

二、常见应用场景

1. 资源释放
file, err := os.Open("test.txt")
if err != nil {log.Fatal(err)
}
defer file.Close()

打开文件后,使用 defer 确保最终关闭文件,即使中途发生错误也能安全释放资源。


2. 锁的释放
mu.Lock()
defer mu.Unlock()

3. 捕获异常

结合 recover() 使用,优雅处理 panic:

func safe() {defer func() {if r := recover(); r != nil {fmt.Println("捕获异常:", r)}}()panic("something went wrong")
}safe()
// 输出:捕获异常: something went wrong

三、参数的求值时机

虽然函数调用被延迟,但参数会立即计算

func test(x int) {defer fmt.Println("defer:", x)x++fmt.Println("normal:", x)
}test(10)
// 输出:
// normal: 11
// defer: 10

四、defer 的性能影响

  • • defer 虽然非常实用,但在高性能敏感代码中频繁使用 defer 可能造成微小开销
  • • Go 1.14 起,defer 性能有显著优化。

五、多个 defer 的执行顺序

func f() {for i := 1; i <= 3; i++ {defer fmt.Println("defer", i)}
}
f()
// 输出:
// defer 3
// defer 2
// defer 1

六、小技巧:修改返回值

defer 可用于修改命名返回值,用于函数退出前调整返回数据。

func demo() (result int) {defer func() {result += 100}()return 1
}fmt.Println(demo()) // 输出 101

七、小结

特性说明
延迟执行在函数返回前执行,可用于清理资源
栈顺序多个 defer 后进先出执行
参数时机参数立即求值,函数调用延迟执行
常见用途文件关闭、解锁、恢复 panic 等
返回值控制可用于修改命名返回值

defer 简洁强大,是写出安全、可维护 Go 代码的重要利器。

http://www.xdnf.cn/news/510175.html

相关文章:

  • 8.1UDP点对点聊天小项目
  • 软件架构之--论微服务的开发方法1
  • 软件工程各种图总结
  • 数据库MySQL基础2
  • 【回溯 剪支 状态压缩】# P10419 [蓝桥杯 2023 国 A] 01 游戏|普及+
  • Java大厂面试:从Web框架到微服务技术的场景化提问与解析
  • FAST-DDS源码分析PDP(一)
  • NoSQL实战指南:MongoDB与Redis企业级开发实战
  • Vue 3 动态 ref 的使用方式(表格)
  • 【Linux高级全栈开发】2.1.3 http服务器的实现
  • AI:NLP 情感分析
  • Filament引擎(一) ——渲染框架设计
  • 中级网络工程师知识点7
  • 课外活动:需了解的海象运算符(:=)
  • HTTPS的工作过程
  • 低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player
  • 贪心、分治和回溯算法
  • 当AI自我纠错:一个简单的“Wait“提示如何让模型思考更深、推理更强
  • MySQL(21)如何查询表中的所有数据?
  • ffmpeg -vf subtitles添加字幕绝对路径问题的解决方法
  • 吴恩达机器学习(1)——机器学习算法分类
  • NetApp FAS存储系统的加密Encrytpion解决方案介绍
  • 西门子1200/1500博图(TIA Portal)寻址方式详解
  • 从零开始实现大语言模型(十五):并行计算与分布式机器学习
  • 【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析
  • java中sleep()和wait()暂停线程的区别
  • 算法题(149):矩阵消除游戏
  • 计算机系统---TPU(张量处理单元)
  • k6学习k6学习k6学习k6学习k6学习k6学习
  • 一文读懂软链接硬链接