美文网首页
Go defer return 学习笔记

Go defer return 学习笔记

作者: Jaycee88 | 来源:发表于2020-06-14 16:27 被阅读0次
    1. defer 语句并不会马上执行,而是会进入一个栈,函数 return 前,会按先进后出(FILO)的顺序执行。也就是说最先被定义的 defer 语句最后执行。先进后出的原因是后面定义的函数可能会依赖前面的资源,自然要先执行;否则,如果前面先执行,那后面函数的依赖就没有了。

    2. 使用 defer 最容易采坑的地方是和带命名返回参数的函数一起使用时。
      defer 语句定义时,对外部变量的引用是有两种方式的,分别是作为函数参数和作为闭包引用。作为函数参数,则在 defer 定义时就把值传递给 defer,并被缓存起来;作为闭包引用的话,则会在 defer 函数真正调用时根据整个上下文确定当前的值。

    3. 避免掉坑的关键是要理解这条语句:

    return xxx
    

    这条语句并不是一个原子指令,经过编译之后,变成了三条指令:

    1. 返回值 = xxx
    2. 调用 defer 函数
    3. 空的 return
    

    1,3 步才是 return 语句真正的命令,第 2 步是 defer 定义的语句,这里就有可能会操作返回值。

    1. 大家可能注意到,函数 increaseA() 是匿名返回值,返回局部变量,同时 defer 函数也会操作这个局部变量。对于匿名返回值来说,可以假定有一个变量存储返回值,比如假定返回值变量为 anony,上面的返回语句可以拆分成以下过程:
    annoy = i
    i++
    return
    

    由于 i 是整型,会将值拷贝给 anony,所以 defer 语句中修改 i 值,对函数返回值不造成影响,所以返回 0 。

    func increaseA() int {
        var i int
        defer func() {
            i++
        }()
        return i
    }
    

    重点观察:
    (1). 是作为函数参数和还是作为闭包引用
    (2). 是匿名返回值还是带命名返回参数的函数

    参考文章

    相关文章

      网友评论

          本文标题:Go defer return 学习笔记

          本文链接:https://www.haomeiwen.com/subject/zyaxxktx.html