defer vs return

defer 看起来与try…catch 类似,其实有许多不为人知的小技巧

defer

官方行文defer先进后出,对return进行一些扫尾工作。这意味着使用该函数在返回值之前,defer函数内是可以访问使用defer的函数内任意变量。那么问题来了,在defer函数内对所在函数变量进行修改,会影响返回的结果吗?

码说

示例展示了两个使用defer的函数。用匿名返回类型,与具名返回类型函数,猜猜结果有无变化?

 package main

 import "fmt"

 func main() {
     fmt.Println("tstring return: ", tstring())
     fmt.Println("tstring1 return: ", tstring1())
 }

 func tstring() string {
     s := "a_"
     defer func() {
         s = s + "a"
         fmt.Println("defer: ", s)
     }()
     return s
 }

 func tstring1() (s string) {
     defer func() {
         s = s + "b"
         fmt.Println("defer1: ", s)
     }()
     return s
 }

测试

代码验证

 vagrant@homestead  go run test.go
defer:  a_a
tstring return:  a_
defer1:  b
tstring1 return:  b

结论

是不是很诡异?具名返回值类型时,结合defer可以修改return返回值,而匿名则不会。

细细思之,这种安排也合情合理,谁还会将一次性手纸重复利用?
匿名变量顾名思义,用过即丢,不会再理了。具名,为什么要有名字,不就是为了复用。
既然是复用,再次用之怎能不可改变?否则安排就没意义了

拓展

想想如果返回类型是指针类型,有名与无名返回类型是否有区别?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值