zoukankan      html  css  js  c++  java
  • Go 彻底弄懂return和defer的微妙关系

    package main
     
    import "fmt"
     
    func main()  {
        fmt.Println("f1 result: ", f1())
        fmt.Println("f2 result: ", f2())
    }
     
    func f1() int {
        var i int
        defer func() {
            i++
            fmt.Println("f11: ", i)
        }()
     
        i = 1000
        return i
    }
     
    func f2() (i int) {
        defer func() {
            i++
            fmt.Println("f21: ", i)
        }()
        i = 1000
        return i
    }

    f1函数:

      进入该函数,因为没有指定返回值变量,需要先声明i变量,因为是int类型,如果没有赋值,该变量初始化值为0,之后执行i=1000的赋值操作,然后执行return语句,返回i的值。

      真正返回之前还要执行defer函数部分,两个defer函数分别针对i进行自增操作,i的值依次为1001和1002

    f2函数:

      进入该函数,因为已经定义好了返回值变量即为i,然后直接赋值i=1000,再返回i的值。

      同样的,也要在真正返回i前,执行两个defer函数,同样i依次自增得到1001和1002。

      问题的关键是为什么无名参数返回的值是1000,其并未收到defer函数对于i自增的影响;而有名函数在执行defer后,最后返回的i值为1002。

    原因就是return会将返回值先保存起来,对于无名返回值来说,
    保存在一个临时对象中,defer是看不到这个临时对象的;
    而对于有名返回值来说,就保存在已命名的变量中。

  • 相关阅读:
    传统工业制造商Opto 22宣布加入Linux基金会
    Android Stack
    An Overview of the Android Architecture (Android Studio)
    基于嵌入式操作系统的物联网安全
    什么是雾计算?它与云计算有什么区别?
    《速度与激情8》中的信息安全技术
    专利驳回的三大基本原因
    专利
    【习题 4-2 Uva201】Squares
    【习题4-1 Uva1589】Xiangqi
  • 原文地址:https://www.cnblogs.com/forgo/p/13490720.html
Copyright © 2011-2022 走看看