# defer 的底层原理是怎样的?
思路
- 协程记录defer信息,函数退出时调用
- 将 defer 代码直接编译进函数尾
思路1 堆上分配
- 1.12 之前使用(需要处理垃圾回收的问题)
- 在堆上开辟一个sched.deferpool
- 遇到defer语句,将信息放入deferpool
- 函数返回时,从 deferpool 取出执行
思路2 栈上分配
- 1.13 之后出现
- 遇到 defer 语句,将信息放入栈上
- 函数返回时,从栈中取出执行
- 只能保存一个defer信息(防止栈空间太大)
思路3 开放编码
- 1.14 之后出现的
- 如果 defer 语句在编译时就可以固定
- 直接改写用户代码,defer语句放入函数末尾
- 效率最高,代码改动最小
- 需要在编译时触发,触发条件比较难
总结
- defer 可以方便业务的编写
- defer 有两种思路,三种实现
- 性能最高的是开放编码