在golang中,我们使用defer语句来进行一些错误处理和收尾工作,它的作用类似java里面finally关键字的作用。不过不论是java的finally关键字还是c++的Raii类,我们都能清楚地知道它们的作用域和执行的时机,那么golang中defer关键字所处理的内容是在什么时候执行的呢?

首先官方文档中说:函数返回、函数结束或者对应的goroutine发生panic的时候defer就会执行。

然后需要注意的是因为golang支持多值返回,所以是在返回前把返回值压到栈中的,而c语言是把返回值存到寄存器中返回。

golang返回时,先把返回值压栈;然后执行defer函数,如果defer函数中有修改栈中的返回值(不过不应该这样做),那么返回值会被修改;之后进行跳转返回。

这样的话我们就清楚了defer执行的时机了,即使你把defer写在返回之前很远的地方,它还是会在函数返回之前执行。

如果一个作用域中有多个defer,那么返回前的执行顺序是先执行后调用的defer,再执行早调用的defer。

官方文档里面有几个例子可以很好地说明defer的作用时机,如下:

lock(l)defer unlock(l)  // unlocking happens before surrounding function returns// prints 3 2 1 0 before surrounding function returnsfor i := 0; i <= 3; i++ {    defer fmt.Print(i)}// f returns 1func f() (result int) {    defer func() {        result++    }()    return 0}

相关文章教程推荐:golang教程

更多相关文章

  1. golang不可重入函数实现
  2. golang的函数怎么写
  3. 从go语言闭包谈函数式编程
  4. go语言中函数与方法介绍
  5. go语言结构体组合函数介绍
  6. golang如何调用函数?
  7. 详解Golang中函数作为值与类型
  8. go语言中普通函数与方法的区别是什么?
  9. 详解Go 中方法与函数的区别

随机推荐

  1. 分享崔庆才的一些学习经验和生活感悟
  2. 为什么要用 Node.js?[每日前端夜话0x77]
  3. pytest中print的坑
  4. 程序员到底该怎么给女朋友挑礼物
  5. 互联网骨干网间的连接(NAP和BGP)
  6. Android中自带的SQLite数据库
  7. 抄答案就是了,两套详细的设计方案,解决头疼
  8. 利用深度学习识别滑动验证码缺口位置
  9. 升级华为网络设备(路由器,防火墙和交换机),提
  10. 如何用一条命令将网页转成电脑 App