观察下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import "fmt"
func t() (data int) {
defer func() {
data += 1
}()
return 2
}
func main() {
b := t()
fmt.Println(b)
}
上面这段代码的输出是 3
。
函数在 return 的时候不是原子性的,有两步:
- 将返回值赋给一个变量;
- 执行 RET 指令;
defer 语句就执行在步骤1、2之间。 defer
语句修改了返回值 data
,所以 data
是 3。