登录
首页 >  Golang >  Go教程

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

时间:2024-10-27 17:00:54 378浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Go 中 defer 的执行顺序:后进先出,但参数值是如何确定的?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


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 的执行顺序:后进先出,但参数值是如何确定的?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>