zoukankan      html  css  js  c++  java
  • golang 测试 defer 与 return 与返回值预先命名之间的关系

    package main
    
    import "fmt"
    
    // 测试 defer 与 return 与返回值预先命名之间的关系
    
    func test1() int  {
        var a int
        defer func() {
            a++
            fmt.Println("defer one in data a = ",a)
        }()
        defer func() {
            a++
            fmt.Println("defer one in data a = ",a)
        }()
        return a
    }
    func test2() (a int)  {
        defer func() {
            a++
            fmt.Println("defer two in data a = ",a)
        }()
        defer func() {
            a++
            fmt.Println("defer two in data a = ",a)
        }()
        return
    }
    func test3()  int  {
        var a int
        defer func() {
            a++
            fmt.Println("defer three in data a = ",a)
        }()
        defer func() {
            a++
            fmt.Println("defer three in data a = ",a)
        }()
        a+=10
        return a
    }
    
    func test4() (a int)  {
        defer func() {
            a++
            fmt.Println("defer forty in data a = ",a)
        }()
        defer func() {
            a++
            fmt.Println("defer forty in data a = ",a)
        }()
        a+=10
        return
    }
    
    func test5()  int  {
        var a int
        defer func(a int) {
            a++
            fmt.Println("defer five in data a = ",a)
        }(a)
        defer func(a int) {
            a++
            fmt.Println("defer five in data a = ",a)
        }(a)
        a+=10
        return a
    }
    
    
    func main() {
        fmt.Println(test1())
        fmt.Println(test2())
        fmt.Println(test3())
        fmt.Println(test4())
        fmt.Println(test5())
        /*
        defer one in data i =  1
        defer one in data i =  2
        0
    
        defer two in data i =  1
        defer two in data i =  2
        2
    
        defer three in data i =  11
        defer three in data i =  12
        10
    
        defer forty in data i =  11
        defer forty in data i =  12
        12
    
        defer five in data a =  1
        defer five in data a =  1
        10
    
        result:
        如果函数返回值预先设置了,
            返回的值会根据defer的操作进行给改变
        如果函数返回值实在内部定义,则返回的数据不会随defer中操作变化
    
        test5 表示方法从上至下执行,
            初始化一个变量a,defer 压入栈中(两个defer中a=0)
            返回10,表示return先与defer先执行
          "defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。"
        */
    
    }

    资料来源:https://www.cnblogs.com/saryli/p/11371912.html

  • 相关阅读:
    职业规划 !!
    linux上ssh配置指南
    低内存VPS用轻量级的Dropbear替换OpenSSH
    修改shell终端提示信息
    减少windows7内存占用的优化方案(内存占用才285兆 比XP还省)
    linux下提示符修改
    mysql存储过程学习笔记区块,条件,循环
    Apache下实现禁止目录浏览
    [学习指导] linux 启动过程以及 /etc/rc.d/init.d/目录的一点理解
    mysql 5.0存储过程学习总结
  • 原文地址:https://www.cnblogs.com/zengxm/p/13043158.html
Copyright © 2011-2022 走看看