GO语言教程4:defer(延迟语句)详解
文章目录
- 1.defer语句格式
- 2.defer执行的时间
- 3.defer语句的作用
- 4.defer语句执行的顺序
- 5.defer与return的value之间的关系
- 6.用defer进行代码跟踪
- 7.defer一定会被执行吗?
Go语言系列教程:https://blog.csdn.net/zhangpeterx/article/details/89040274
defer是Go语音中非常重要的一个关键字,需要深入的了解。
1.defer语句格式
defer后只能接函数,如:
defer func() {fmt.Println("defer print")}()
2.defer执行的时间
defer被称为延迟语句,在return函数执行前执行defer语句。
如:
package mainimport "fmt"func main() {defer func() {fmt.Println("defer print")}()fmt.Println("outer print")
}
输出结果如下:
outer print
defer print
3.defer语句的作用
defer语句设计的初衷是用来关闭或释放资源的。
如下:
func main() {f, err := os.Create("test.file")if err != nil {panic("cannot create file")}defer f.Close()// no matter what happens here file will be closed// for sake of simplicity I skip checking close resultfmt.Fprintf(f, "hello")
}
4.defer语句执行的顺序
defer语句执行的顺序是先进后出,也就是栈。
先遇到的defer语句会把函数及其参数
压进栈中,最后再统一执行。
func main() {for i := 0; i < 4; i++ {defer fmt.Println(i)}
}
结果如下:
3
2
1
0
如果把代码改为如下:
func main() {for i := 0; i < 4; i++ {defer func() {fmt.Println(i)}()}
}
输出结果如下:
4
4
4
4
这是因为在运行到defer
语句时,i
并不是函数参数,是外部变量,所以会直接读取外部变量的值。
5.defer与return的value之间的关系
因为defer语句是延迟执行,那么就涉及到如果defer语句修改了return的value,那么return的结果到底是什么这个问题。
如果函数的返回值是有名变量,那么defer语句可以直接操作变量:
func c() (i int) {defer func() { i++ }()return 1
}func main() {fmt.Println("c return :", c())
}
输出:
c return : 2
具体过程是:
i=1
i++
return i
如果是无名变量,return最初的结果:
func c() int {var i int = 0defer func() { i++ }()return i
}func main() {fmt.Println("c return :", c())
}
输出:
c return : 0
6.用defer进行代码跟踪
defer语句另一个用法是用来跟踪代码,如在函数开始和结束的时候打印相关信息:
package mainimport "fmt"func trace(s string) string {fmt.Println("开始执行", s)return s
}
func untrace(s string) {fmt.Println("结束执行", s)
}
func a() {defer untrace(trace("a"))fmt.Println("a的逻辑代码")
}
func b() {defer untrace(trace("b"))fmt.Println("b的逻辑代码")a()
}func main() {b()
}
输出结果如下:
开始执行 b
b的逻辑代码
开始执行 a
a的逻辑代码
结束执行 a
结束执行 b
7.defer一定会被执行吗?
不一定,如果你调用os.Exit()
,那么defer不会被执行。
参考:
- Use of defer in Go - Stack Overflow
- go - How does defer and named return value work? - Stack Overflow
GO语言教程4:defer(延迟语句)详解相关推荐
- c语言自定义color,forecolor c语言中的颜色设置语句详解
backcolor与forecolor的区别 backcolor:用来设置图像的背景颜色,也用来设置文档.表格.图像等的背景颜色. forecolor:用来设置图像的前景颜色,也用来设置文档.表格.图 ...
- c语言输入循环语句,C语言中输入输出和循环语句详解.ppt
C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...
- Java教程:Java continue语句详解
Java教程有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 Java 提供了 continue 语句.continue 语句是 break ...
- 单片机c语言常用的语句有几条,单片机C语言常用语句详解
<单片机C语言常用语句详解>由会员分享,可在线阅读,更多相关<单片机C语言常用语句详解(22页珍藏版)>请在人人文库网上搜索. 1.C51编程中常见语句的总结.首先,C51定义 ...
- 单片机c语言常用语,单片机C语言常用语句详解
<单片机C语言常用语句详解>由会员分享,可在线阅读,更多相关<单片机C语言常用语句详解(22页珍藏版)>请在人人文库网上搜索. 1.C51编程常用语句总结,一.C51定义SFR ...
- c语言二级指针有什么作用,C语言中二级指针的实例详解
C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...
- c语言二级证题库及详解答案,全国计算机等级考试二级C语言上机题库及其答案详解...
全国计算机等级考试二级C语言上机题库及其答案详解 全国计算机二级C语言上机考试题第一套给定程序的功能是:求二分之一的圆面积,函数通过形参得到圆的半径,函数返回二分之一的圆面积( 注: 圆面积公式为:2 ...
- mysql的load data_【MySQL】load data语句详解(一)
作者 罗小波 沃趣科技高级MySQL数据库工程师 load data语句详解 背景 数据库版本:MySQL 5.7.18 服务器信息:本地到处导入在10.10.30.241上演示,local远程导入 ...
- Go 语言快速开发入门(基础语法详解,第一节)
Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...
- c语言指针用法及实际应用详解,通俗易懂超详细
c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...
最新文章
- 记录QT片断1-(痛苦的win32)
- golang 小知识-持续更新中
- python环境设置_MacOS中的Python(和NumPy)开发环境设置
- JAVA集合迭代遍历和特性介绍
- 3 View - 状态保持 session
- web端项目展开测试步骤
- vue http get html模板,怎么用vue.js做异步请求?
- 6. 集成学习(Ensemble Learning)算法比较
- NFC reader ( ISO 15693 ) NFC相关技术详解(附源代码)
- 信息学奥赛一本通网站
- Retina屏兼容处理
- Super Jumping! Jumping! Jumping!超级跳!跳!跳!
- 小O地图EXE版V0.9.5.5 - 功能总览
- WinRAR命令行用法
- 线性稳压电源和开关电源到底有什么区别
- 嵌入式linux数控系统,关于ARM+DSP嵌入式Linux数控系统设计.pdf
- DFC own Administrator permission
- [转载][转]无线衰落信道、多径与OFDM、均衡技术
- Linux涂鸦智能网关面板Turnkey方案
- Windows10安装IDEA 2020.1.2及你懂得
热门文章
- CellPress | 医学上人工智能的缺失
- 决策树算法(四)——选取最佳特征划分数据集
- 线粒体|GetOrganelle组装软件
- SBIO | 许金荣/江聪团队报道禾谷镰刀菌MAPKs介导的生长发育、逆境响应及生物互作机制...
- Geoderma:南土所梁玉婷组-施用粪肥土壤中抗生素抗性基因和金属抗性基因的共存机制...
- SCImago Journal Rank:微生物领域期刊综合评价指标排名
- Science Bulletin:上海植生所王二涛组发表基于绝对丰度的植物根际微生物群落“扩增-选择”组装模型
- CHM:植物利用细菌获得真菌抗性!中山大学李剑峰课题组揭示植物免疫预警新机制...
- Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE
- R语言使用ggpubr包的ggline函数绘制各种漂亮形式的线图实战