Skip to main content

defer坑点收录

· 2 min read
Czasg

Go defer 史诗级坑点整理!

入参是确定的

func demo() {
i := 1
defer fmt.Println(i) // 输出1
i++
return i
}

入参在 defer 出现时刻已经确定,因为执行 defer fmt.Println(i) 时已经生成临时变量拷贝了一份参数。

后近先处

这个通常没有问题,即后面定义的 defer 会先执行,很好理解。

可操作具名参数返回

func demo() (result int) {
i := 1
defer func() {
result++ // demo函数返回值为2
}
return i
}

此处函数 return 实际可以拆解为两步,即:

result = i
return

故 defer 会修改此处实际返回值。

不可操作非具名返回

同样的函数我们作下适当的调整

func demo() int {
i := 1
defer func() {
i++ // demo函数返回值为1
}
return i
}

在执行 return 的时候,已经生成临时变量存储返回值,故延迟函数 defer 无法对返回值做出修改。


👇👇👇

本文作者: Czasg
版权声明: 转载请注明出处哦~👮‍