Go defer函数陷阱与闭包理解
20 浏览量
更新于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
最新资源
- ATT7022B-programe,网络验证c语言源码,c语言
- Utils:一些实用程序
- chatomud
- configs:基于UNIX的点文件
- Feminazi a flor-crx插件
- 802.11b PHY Simulink 模型:802.11b 基带物理层的 Simulink:registered: 模型。-matlab开发
- SQLITE
- CpuTimer0,c语言read源码,c语言
- java-projects
- 오늘의 운세-crx插件
- technical-community-builders:雇用技术社区建设者的公司
- csrf_attack_example
- grpar:提取构建引擎组(.grp)文件的工具-开源
- Backjoon
- 每日日记:一种日记应用程序,融合了我在编码过程中所学到的技术
- AT89C2051UPS,c语言输出图形源码,c语言