我一直盯着这段代码,但无法弄清楚其行为的原因。
package main
import (
"fmt"
)
var i int
func example() int {
defer func() {
fmt.Println("defer")
i = 1
}()
fmt.Println("first")
return i
}
func main() {
fmt.Println(example())
fmt.Println(i)
}
Run Code Online (Sandbox Code Playgroud)
首先,我的预期输出是:
first
defer
1
1
Run Code Online (Sandbox Code Playgroud)
但是,正如您在操场上看到的,实际输出是:
first
defer
0
1
Run Code Online (Sandbox Code Playgroud)
这是延迟匿名函数行为吗?没有
那么,为什么要打印呢0?
函数返回后是否延迟运行?
当然。
那么,为什么打印0呢?
因为你返回的是 0。
example()按值返回int。当return i评估时,i返回 s 当前值。评估该返回值后,该defer函数将执行,将存储在的值更改i为1。但该0值已经是返回值了。
Go 使得修改函数的返回值成为可能,但前提是返回值有名称。
例如,这返回 1:
func example() (j int) {
defer func() { j = 1 }()
return 0
}
Run Code Online (Sandbox Code Playgroud)
但就您而言,您没有命名返回变量,因此您无法在延迟中修改它。