golang中的defer关键字什么时候生效


本文摘自php中文网,作者V,侵删。

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

lock(l)

defer unlock(l)  // unlocking happens before surrounding function returns

 

// prints 3 2 1 0 before surrounding function returns

for i := 0; i <= 3; i++ {

    defer fmt.Print(i)

}

 

// f returns 1

func f() (result int) {

    defer func() {

        result++

    }()

    return 0

}

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

以上就是golang中的defer关键字什么时候生效的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

go语言中while是关键字吗

golang gin框架国内安装方法

聊聊golang的ddd项目结构

如何处理golang返回值较多问题

专访go语言布道师dave cheney:go语言这十年,只能用“成功”一词总结

golang的内存泄漏分析

go - json.unmarshal 遇到的小坑

nginx 服务搭建

【gocn酷go推荐】goroutine 泄漏防治神器 goleak

golang 无缓存channel和有缓存channel

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...