Go 中 defer 的执行顺序:后进先出,但参数值是如何确定的?
go中defer的执行顺序
在go语言中,defer是一种延迟执行函数的机制。对于下面的代码,大家可以思考一下其打印结果:
func main() { a := 1 defer fmt.Println(a) defer func(s int) { fmt.Println(s) }(a) defer func() { fmt.Println("normal defer") }() a++ }
答案:
同为新手,个人理解:
- 首先,defer遵循后进先出的原则,因此打印顺序为3、2、1。
- 其次,defer注册延迟执行函数时,函数所需的参数值必须确定。
-
逐行分析代码执行过程:
- 初始化 a 为 1。
- 依次注册3个defer函数,其中函数需要参数的值在注册时就确定。
- 执行 a++,使 a 为 2。
-
返回前按序执行defer函数:
- 函数3:传入实参 a=1,在注册时分配内存存储形参 a'。函数执行时,打印 1。
- 函数2:同上。
- 函数1:无参函数,注册时不分配内存。函数执行时,查找参数 a(此时为 2),打印 2。
以上就是Go 中 defer 的执行顺序:后进先出,但参数值是如何确定的?的详细内容,更多请关注其它相关文章!