Go语言defer与函数返回值的陷阱

func test() (ret int){
	ret = 10
	return 1
}

函数的返回值是1

func test01() (ret int){
	defer func(){
		ret = 10
	}()
	return 1
}

函数的返回值是10

func test02() (ret int){
	defer func(){
		ret += 10
	}()
	return 1
}

函数的返回值是11

func test03() (ret int){
	ret = 10
	defer func(){
		
	}()
	return 1
}

返回值是1

func test04() (ret int) {
    defer func(ret int) {
        r = r + 5
    }(ret)
    return 1
} 
func test05() (ret int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}

返回值是5
由此可见,显示声明返回值的函数处理返回值的时候有三种情况:
(1)如果defer中没有对返回值的处理,那么return关键字的优先级高于显示的声明的返回值;如test()
(2)如果defer中存在对返回值的闭包处理,那么实际的执行过程以test01为例:ret = 1,ret = 10, return ret
(3)函数调用的时候参数传入的是副本,所以非闭包调用的时候并没有修改返回值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值