[golang]defer 别再记各种case了

要点

1.defer函数的入参值,在出现的时候就确定

2.return不是原子操作,而是先赋值,再return

3.多个defer,采用队列方式执行.

第三点不难理解.下面用两个例子来说明前面两点.

func test01() {
   age := 1
   defer fmt.Println(age)
   age = 4
}

func test02() {
   age := 1
   defer func() {
      fmt.Println(age)
   }()
   age = 4
}

func test03() {
   age := 1
   defer func(age int) {
      fmt.Println(age)
   }(age)
   age = 4
}

打印结果

1打印1

2打印4

3打印1

初学go的时候有疑问,为啥test1打印1,符合defer的入参在defer出现的时候赋值,

为啥test2就不是了呢?  因为test2里函数执行的时候,这个age的变量就是外面的变量呀.   test1的传参是age的值的拷贝. test3应该可以懂的,只不过test3是匿名函数写法.

/**
相当于
age=1
age++
return
所以返回2
**/
func test31() (age int) {
   age = 1
   defer func() {
      age++
   }()
   return age
}

/**
相当于
age=1
age=4
返回值=age  注意这里是具名返回值和非具名返回值的区别
age++
return
所以返回4
**/
func test32() int {
   age := 1
   defer func() {
      age++
   }()
   age = 4
   return age
}

/**
相当于
age=1
defer 这里的age++是age的拷贝+1,和原来的age没有任何关系
return
返回1
**/
func test33() (age int) {
   age = 1
   defer func(age int) {
      age++
   }(age)
   return age
}

/**
age2=1
age=age2
age++
return
所以返回了2
**/
func test34() (age int) {
   age2 := 1
   defer func() {
      age++
   }()
   return age2
}

return是非原子操作.要拆解成两步来理解,且具名返回值和非具名返回值也要区别看.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值