Go defer 的执行顺序?

请尝试在评论区里写下答案(如不能清楚表述,那么你可能没真正理解)。欢迎参与,为下一次求职做准备。

请在评论区写下你的答案。

微信搜索:上帝喜爱笨人
讨论数量: 6

defer 的执行顺序可以参考栈的特性,先进后出,定义defer就相当于进栈,退出时就相当于defer的出栈并执行。
通俗讲就是按运行时的顺序,先定义后执行。

2年前 评论

先进后出

2年前 评论
梦想止于行动

defer 底层是使用栈的,所以会先进后出

2年前 评论

defer 的执行顺序是先进后出,defer 在被压栈时,会把当前环境下的变量一起带到栈中。如:
func main() {

var arg = 1
defer fmt.Println(arg)

arg = 2
defer fmt.Println(arg)

}

1年前 评论

一个函数中的多条 defer 语句,执行顺序与声明顺序相反。

1年前 评论
  • 执行顺序
    • 按照定义倒叙执行,先进后出, 类似 栈的 LIFO
    • 函数中
      • 不命名的返回值,那么 defer 不会影响 return 的返回值
      • 带命名的返回值
        • 第一步:先 return 对返回值变量 value 进行赋值
        • 第二步:再执行 defer,如果 defer中有对 返回值 value 有操作,则会影响到返回值
        • 第三步:执行 return 返回最终的 返回值 value
  • defer 作用
    • 在当前函数执行完毕后延迟执行
    • 释放资源
    • 日志记录
    • 这些都会是在函数返回之前执行
  • defer 原理
    • 每一个 defer 对应一个 _defer 实例
    • 多个实例通过指针串起来形成链表,保存在 goroutine 数据结构
    • 每次新的 defer 插入链表头部
    • 函数结束前,从头部依次取出执行,形成 LIFO 的效果
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!