• 技术文章 >后端开发 >Golang

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

    VV2019-12-09 14:55:39原创701

    在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 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关键字什么时候生效的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:golang defer 关键字 生效
    上一篇:golang map有什么用 下一篇:golang 断言是什么
    大前端线上培训班

    相关文章推荐

    • golang中fscanf读取文件时把回车替换成0• golang与java语法上的区别• golang中创建错误的方法• golang map有什么用

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网