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函数遵循后进先出的原则,因此执行顺序为:
- func(a int) { fmt.println(a) }
- fmt.println(a)
- 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?的详细内容,更多请关注其它相关文章!