defer 实现原理

defer 实现原理

type _defer struct {
    sp      uintptr   //函数栈指针
    pc      uintptr   //程序计数器
    fn      *funcval  //函数地址
    link    *_defer   //指向自身结构的指针,用于链接多个defer
}

结构是单链表构成的一个函数链,每次声明一个defer时就将defer插入到单链表表头

在编译在阶段,声明defer处插入了函数deferproc(),在函数return前插入了函数deferreturn()

return不是原子操作,执行过程是: 保存返回值(若有)–>执行defer(若有)–>执行ret跳转