Go defer 语句执行顺序:为什么代码输出 221?

go defer 语句执行顺序:为什么代码输出 221?

go打印defer分析

在以下代码中:

package main

import "fmt"

func main() {
  a := 1
  defer fmt.println(a)
  a++
  defer fmt.println(a)
  defer func(a int) { fmt.println(a) }(a)
}

程序的打印结果为:

2
2
1

理解打印顺序

这个问题涉及到go语言中defer关键字的使用。defer指延迟执行的意思,即在当前函数返回前执行defer后面的函数。

defwer函数遵循后进先出的原则,因此执行顺序为:

  1. func(a int) { fmt.println(a) }
  2. fmt.println(a)
  3. fmt.println(a)

理解参数传递

defwer注册要延迟执行的函数时,该函数所有的参数都需要确定其值。因此在代码中,a++操作是在defer函数注册之后执行的。

在第一个defer函数中,func(a int) { fmt.println(a) },参数a在注册时被赋值为此时的实参a=1。随后执行输出1。

在第二个defer函数中,fmt.println(a),参数a也同样在注册时被赋值为此时的实参a=1。

在第三个defer函数中,无参函数,执行时先上寻找参数a(此时为2)。

以上就是Go defer 语句执行顺序:为什么代码输出 221?的详细内容,更多请关注其它相关文章!