
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?的详细内容,更多请关注米云其它相关文章!
