
函数返回值与延迟函数的困惑
在 go 语言中,使用 defer 函数延迟执行某些操作,这可能引起一些困惑。让我们通过示例代码来了解其工作原理。
例程:
package main
import (
"fmt"
)
func main() {
fmt.Println(f0()) // 1
fmt.Println(f1()) // 0
}
func f0() (result int) {
defer func() {
result++
}()
return 0
}
func f1() (result int) {
result = 0 //return语句不是一条原子调用,return xxx其实是赋值+RET指令
return
}困惑:
- f0 中返回的是 0,但在打印时却变成了 1。
- f1 中没有明确返回任何值,但打印时却为 0。
解答:
- defer 函数在 return 之前执行。在这段代码中,defer 函数对变量 result 进行自增,因此返回的值为 1,而不是 0。
- 在 go 语言中,没有 null 值。int 类型变量的默认值为 0,slice 和 map 等复合类型的默认值为 nil。因此,f1 中的 result 变量被隐式初始化为 0,这就是为什么打印时显示为 0。
综上所述,在使用延迟函数时,需要注意其执行顺序和对变量的影响。了解 go 语言的类型系统和默认值对于避免此类困惑至关重要。











