文章目录

  • 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(延迟语句)详解相关推荐

  1. c语言自定义color,forecolor c语言中的颜色设置语句详解

    backcolor与forecolor的区别 backcolor:用来设置图像的背景颜色,也用来设置文档.表格.图像等的背景颜色. forecolor:用来设置图像的前景颜色,也用来设置文档.表格.图 ...

  2. c语言输入循环语句,C语言中输入输出和循环语句详解.ppt

    C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...

  3. Java教程:Java continue语句详解

    Java教程有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 Java 提供了 continue 语句.continue 语句是 break ...

  4. 单片机c语言常用的语句有几条,单片机C语言常用语句详解

    <单片机C语言常用语句详解>由会员分享,可在线阅读,更多相关<单片机C语言常用语句详解(22页珍藏版)>请在人人文库网上搜索. 1.C51编程中常见语句的总结.首先,C51定义 ...

  5. 单片机c语言常用语,单片机C语言常用语句详解

    <单片机C语言常用语句详解>由会员分享,可在线阅读,更多相关<单片机C语言常用语句详解(22页珍藏版)>请在人人文库网上搜索. 1.C51编程常用语句总结,一.C51定义SFR ...

  6. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  7. c语言二级证题库及详解答案,全国计算机等级考试二级C语言上机题库及其答案详解...

    全国计算机等级考试二级C语言上机题库及其答案详解 全国计算机二级C语言上机考试题第一套给定程序的功能是:求二分之一的圆面积,函数通过形参得到圆的半径,函数返回二分之一的圆面积( 注: 圆面积公式为:2 ...

  8. mysql的load data_【MySQL】load data语句详解(一)

    作者  罗小波 沃趣科技高级MySQL数据库工程师 load data语句详解 背景 数据库版本:MySQL 5.7.18 服务器信息:本地到处导入在10.10.30.241上演示,local远程导入 ...

  9. Go 语言快速开发入门(基础语法详解,第一节)

    Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...

  10. c语言指针用法及实际应用详解,通俗易懂超详细

    c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...

最新文章

  1. 记录QT片断1-(痛苦的win32)
  2. golang 小知识-持续更新中
  3. python环境设置_MacOS中的Python(和NumPy)开发环境设置
  4. JAVA集合迭代遍历和特性介绍
  5. 3 View - 状态保持 session
  6. web端项目展开测试步骤
  7. vue http get html模板,怎么用vue.js做异步请求?
  8. 6. 集成学习(Ensemble Learning)算法比较
  9. NFC reader ( ISO 15693 ) NFC相关技术详解(附源代码)
  10. 信息学奥赛一本通网站
  11. Retina屏兼容处理
  12. Super Jumping! Jumping! Jumping!超级跳!跳!跳!
  13. 小O地图EXE版V0.9.5.5 - 功能总览
  14. WinRAR命令行用法
  15. 线性稳压电源和开关电源到底有什么区别
  16. 嵌入式linux数控系统,关于ARM+DSP嵌入式Linux数控系统设计.pdf
  17. DFC own Administrator permission
  18. [转载][转]无线衰落信道、多径与OFDM、均衡技术
  19. Linux涂鸦智能网关面板Turnkey方案
  20. Windows10安装IDEA 2020.1.2及你懂得

热门文章

  1. CellPress | 医学上人工智能的缺失
  2. 决策树算法(四)——选取最佳特征划分数据集
  3. 线粒体|GetOrganelle组装软件
  4. SBIO | 许金荣/江聪团队报道禾谷镰刀菌MAPKs介导的生长发育、逆境响应及生物互作机制...
  5. Geoderma:南土所梁玉婷组-施用粪肥土壤中抗生素抗性基因和金属抗性基因的共存机制...
  6. SCImago Journal Rank:微生物领域期刊综合评价指标排名
  7. Science Bulletin:上海植生所王二涛组发表基于绝对丰度的植物根际微生物群落“扩增-选择”组装模型
  8. CHM:植物利用细菌获得真菌抗性!中山大学李剑峰课题组揭示植物免疫预警新机制...
  9. Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE
  10. R语言使用ggpubr包的ggline函数绘制各种漂亮形式的线图实战