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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值