type _defer struct {
siz int32
started bool
openDefer bool
sp uintptr
pc uintptr
fn *funcval
_panic *_panic
link *_defer
}
runtime._defer
结构体是延迟调用链表上的一个元素,所有的结构体都会通过 link 字段串联成链表。
只要获取到 runtime._defer
结构体,它都会被追加到所在 goroutine _defer
链表的最前面。
defer
关键字的插入顺序是从后向前的,而 defer
关键字执行是从前向后的。
- 后调用的
defer
函数会先执行:- 后调用的
defer
函数会被追加到goroutine _defer
链表的最前面。 - 运行
runtime._defer
时是从前到后依次执行。
- 后调用的
- 函数的参数会被预先计算;
- 调用
runtime.deferproc
函数创建新的延迟调用时就会立刻拷贝函数的参数,函数的参数不会等到真正执行时计算。
- 调用