以下代码会输出什么?
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、是不是命名返回值
KGo笔记
全部评论