讨论数量:
defer 的执行顺序是先进后出,defer 在被压栈时,会把当前环境下的变量一起带到栈中。如:
func main() {
var arg = 1
defer fmt.Println(arg)
arg = 2
defer fmt.Println(arg)
}
- 执行顺序
- 按照定义倒叙执行,先进后出, 类似 栈的 LIFO
- 函数中
- 不命名的返回值,那么
defer
不会影响return
的返回值 - 带命名的返回值
- 第一步:先 return 对返回值变量
value
进行赋值 - 第二步:再执行
defer
,如果defer
中有对 返回值value
有操作,则会影响到返回值 - 第三步:执行
return
返回最终的 返回值value
- 第一步:先 return 对返回值变量
- 不命名的返回值,那么
- defer 作用
- 在当前函数执行完毕后延迟执行
- 释放资源
- 日志记录
- 这些都会是在函数返回之前执行
- defer 原理
- 每一个 defer 对应一个 _defer 实例
- 多个实例通过指针串起来形成链表,保存在
goroutine
数据结构 - 每次新的 defer 插入链表头部
- 函数结束前,从头部依次取出执行,形成 LIFO 的效果
推荐文章: