golang自学之路(defer压栈)10

defer fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")

输出:

c
b
a

先进后出,后进先出

总结:不管有没有异常,defer都会在函数出栈的前一步执行,所有只要函数没有出栈,defer修饰的都是会被执行的。

顺序:函数内其它语句-defer语句-函数出栈

//例1:
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}
 
//例2:
func f() (r int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}
 
//例3:
func f() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}


 

func f() (result int) {
    result = 0 //return语句不是一条原子调用,return xxx其实是赋值+ret指令
    func() { //defer被插入到return之前执行,也就是赋返回值和ret指令之间
        result++
    }()
    return
}
//所以这个返回值是1。
 
//再看例2,它可以改写成这样:
func f() (r int) {
    t := 5
    r = t //赋值指令
    func() { //defer被插入到赋值与返回之间执行,这个例子中返回值r没被修改过
        t = t + 5
    }
    return //空的return指令
}
//所以这个的结果是5。
 
//最后看例3,它改写后变成:
func f() (r int) {
    r = 1 //给返回值赋值
    func(r int) { //这里改的r是传值传进去的r,不会改变要返回的那个r值
        r = r + 5
    }(r)
    return //空的return
}
//所以这个例子的结果是1

 

你可能感兴趣的:(go)