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
}