golang-defer误区

package main

import "fmt"

func f1()(r int){
	defer func(){
		r++
		}()
	return 0
}
func f2()(r int){
	t:=5
	defer func(){
		t=t+5
	}()
	return t
}
func f3()(r int){
	defer func(r int){
		r=r+5
	}(r)
	return 1
}


func main(){
	fmt.Println("f1()=",f1())
	fmt.Println("f2()=",f2())
	fmt.Println("f3()=",f3())

}

执行结果:
在这里插入图片描述
一、f1()
r是函数的有名返回值,分配在栈上

操作r
return 0r=0
defer r=r+1r=1

二、f2()
t和r是相对独立的,在defer中对t的修改,不会影响r

操作r
t:=5,return tr=5
defer t=t+5t=10,r=5

三、f3()
在f3()中执行defer时,func f3()(r int)使用了传参调用,在调用时会将r进行一次值拷贝r1传给函数做形参

操作r
return 1r=1
defer r1=r1+5r1=6,r=1

注意:在defer中修改返回值不是明智的选择,为了避免这种情况,通常在定义函数时使用不带返回值名的格式:

defer f4() int{//z只有返回值类型,无返回值名
}

通过这种方式defer就不能直接引用返回值的栈区(一、f1())

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值