Defer【Golang】
来自智得网
简介
defer 语句注册了一个函数调用,这个调用会延迟到defer语句所在的函数执行完毕后执行,所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句或函数所在的协程发生了panic。
defer 语句可以在函数结束执行,所以通常用于进行资源的释放以及清理。
Go 1.13 版本之后的 defer 都在栈上进行分配,所以defer的执行顺序和声明顺序是相反的。
原理
defer 结构体的定义如下:
type _defer struct {
siz int32 // 内存大小,包括参数以及返回值
started bool
heap bool // 是否是堆上分配
openDefer bool // 是否使用开放编码进行优化
sp uintptr //栈指针
pc uintptr // 调用方的程序计数器
fn *funcval // 传入的函数
_panic *_panic
link *_defer // defer链表
fd unsafe.Pointer
varp uintptr
framepc uintptr
}