Go defer函数陷阱与闭包理解
77 浏览量
更新于2024-08-29
收藏 87KB PDF 举报
Go语言中的`defer`函数是一种强大的工具,它允许我们在函数返回之前执行一段代码。`defer`语句的执行顺序不同于常规函数调用,它遵循“后进先出”(LIFO)的原则,即最后声明的`defer`会在函数返回时最先执行。这在处理异常、清理资源、日志记录等方面非常有用。
在本文中,作者将通过实例来探讨`defer`的几个关键点:
1. 执行顺序:
- 在`main`函数中,尽管`defer`语句的声明顺序是`defer calc("A", x, calc("B", x, y))`,`defer calc("C", x, calc("D", x, y))`,但由于`defer`的执行顺序是逆序,所以首先执行的是`"D"`对应的`calc`,然后是`"C"`,接着是`"A"`和`"B"`。
2. 闭包和变量作用域:
- 示例中,`defer fmt.Println(a+b)` 在 `a` 被修改后仍打印原值 `3`,这是因为`defer`内部的函数(闭包)捕获了`a`和`b`在定义时的值。这表明闭包行为类似于引用传递,而不是值传递。
- 当使用匿名函数作为`defer`的参数,如`defer func(a int, b int) { fmt.Println(a+b) }(a, b)`,即使`a`和`b`在`defer`内部被更新,原始的`a=2`和`b=4`值仍然会被使用,输出结果为`3`,这说明参数传递的是它们的值拷贝。
3. 参数传递:
- `defer`函数内部对参数的引用是在`defer`语句定义时确定的,因此`defer fmt.Println(a+b)`中的`a`和`b`在`defer`声明时的值(1和2)会被使用,而不会受到后续代码改变的影响。
通过这些例子,作者提醒开发者在使用`defer`时要注意代码的行为可能会因为闭包、参数传递以及`defer`执行顺序的不同而有所变化。理解这些要点有助于避免潜在的错误和提高代码可读性。在实际编程中,正确地利用`defer`可以极大地提升代码的组织和可维护性。
2020-12-25 上传
2021-01-20 上传
2023-05-22 上传
2023-02-26 上传
2023-03-10 上传
2023-08-23 上传
2023-09-08 上传
2023-06-02 上传
2023-09-28 上传
weixin_38623009
- 粉丝: 5
- 资源: 906
最新资源
- IEEE 14总线系统Simulink模型开发指南与案例研究
- STLinkV2.J16.S4固件更新与应用指南
- Java并发处理的实用示例分析
- Linux下简化部署与日志查看的Shell脚本工具
- Maven增量编译技术详解及应用示例
- MyEclipse 2021.5.24a最新版本发布
- Indore探索前端代码库使用指南与开发环境搭建
- 电子技术基础数字部分PPT课件第六版康华光
- MySQL 8.0.25版本可视化安装包详细介绍
- 易语言实现主流搜索引擎快速集成
- 使用asyncio-sse包装器实现服务器事件推送简易指南
- Java高级开发工程师面试要点总结
- R语言项目ClearningData-Proj1的数据处理
- VFP成本费用计算系统源码及论文全面解析
- Qt5与C++打造书籍管理系统教程
- React 应用入门:开发、测试及生产部署教程