go面试-defer在return之后执行?

807人浏览 / 0人评论

以下代码会输出什么?

package main

import "fmt"

func hello(i *int) int { defer func() { *i = 50 }() return *i }

func main() { i := 20 j := hello(&i) fmt.Println(i, j) }

先看i的值,因为hello的入参是指针,对入参的修改都会改变传入的值,所以无论是否在defer内,i的值都会被修改为50。

再看j的值,即hello的返回值,在return处,i是20,而defer中又对i进行了修改*i=50。大家都知道,defer是在return之后执行,那这次也会修改返回值么?

并不是,defer修改函数返回值,是针对命名返回值的情况。比如说:

func hello2(i *int) (j int) {
   defer func() {
       j = 50
   }()
   return *i
}

虽然return时,j的值是20,但是在defer中j被修改为50,而j是函数的命名返回值,因此会影响最终函数的返回值。

所以,最终的答案是 50,20

 

对于defer相关的问题,一定要注意两点:

1、是不是指针

2、是不是命名返回值

全部评论