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

posted @ 2020-06-04 14:10  花名k  阅读(178)  评论(0编辑  收藏  举报