首页 思考一下defer的这个问题
文章
取消

思考一下defer的这个问题

观察下面代码的输出是什么?

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 的时候不是原子性的,有两步:

  1. 将返回值赋给一个变量;
  2. 执行 RET 指令;

defer 语句就执行在步骤1、2之间。 defer 语句修改了返回值 data,所以 data 是 3。

本文由作者按照 CC BY 4.0 进行授权