深入理解Golang之defer

(1)巩固练习:

   看看以下三个函数的返回值:

func f() (result int) { 
    defer func() { 
        result++ 
    }() 
    return 0
}
func f() (r int) { 
    t := 5 
    defer func() { 
        t = t + 5 
    }() 
    return t
}

func f() (r int) { 
    defer func(r int) { 
        r = r + 5 
    }(r) 
    return 1
}

 (2) 首先明确:defer在return之前执行

        整个return过程:

        1.没有defer之前,先把在栈中写一个值,这个值被会当作返回值。然后再调用RET指令返回。return xxx语句汇编后是先给返回值赋值,再做一个空的return: ( 赋值指令 + RET指令)

        2.有defer之后,就变成了 (赋值指令 + CALL defer指令 + RET指令),将return语句分开成两句写,return xxx会被改写成:

        返回值 = xxx

        调用defer函数

        空的return

 

(3)分析

     func f() (result int) { 

    result = 0 //return语句不是一条原子调用,return xxx其实是赋值+RET指令 

    func() { //defer被插入到return之前执行,也就是赋返回值和RET指令之间 

        result++ 

    }() 

    return

}

     返回值:1

 

    func f() (r int) { 

    t := 5 

    r = t //赋值指令 

    func() { //defer被插入到赋值与返回之间执行,这个例子中返回值r没被修改过 

        t = t + 5 

    } 

          return //空的return指令

       }

        返回值:5

 

func f() (r int) { 

    r = 1 //给返回值赋值 

    func(r int) { //这里改的r是传值传进去的r,不会改变要返回的那个r值 

        r = r + 5 

    }(r) 

    return //空的return

}

           返回值:  1

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值