defer
从本篇文章开始记录defer相关的知识点,defer相关的内容包括部分
defer会在函数返回之前倒序执行,下面是一段go代码,及其在编译后的伪指令描述。
func A() {
defer B()
// code to do something
}
func A() {
r = deferproc(8, B)
if r > 0 {
goto ret
}
// code to do something
runtime.deferreturn()
ret
runtime.deferreturn()
}
defer指令对应到两部分内容,deferproc负责把要执行的函数信息保存起来,称为defer注册。defer注册完成后,继续执行后面的逻辑,直到返回前通过deferreturn执行注册的defer函数。正是由于先注册,后调用的机制,才实现了defer延迟 执行的效果。
defer信息会注册到一个链表,当前执行的goroutine持有这个链表头指针,将一个个_defer结构体进行链接,新注册的defer会添加到链表头,执行时也是从头开始,这也是defer表现为倒序执行的原因。