Go 中 defer 的执行顺序:后进先出,但参数值是如何确定的?

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 的执行顺序:后进先出,但参数值是如何确定的?的详细内容,更多请关注其它相关文章!