defer 的调用顺序类似于栈,后定义的先调用
defer 关键字 调用了 runtime.deferproc
,在 defer 关键字出现的地方,插入了指令 call runtime.derferproc
,然后在函数返回之前的地方,插入指令 call runtime.deferreturn
普通函数返回时,汇编代码类似
add xx SP
return
如果包含了 defer 语句,则汇编代码是
call runtime.deferreturn
add xx SP
return
goroutine 的控制结构中,有一张表记录 defer,调用 runtime.deferproc 时,会将需要 defer 的表达式记录在表中,而在调用 runtime.deferreturn
的时候,会以此从 defer 表中出栈并执行
func f() (result int) {
defer func() {
result++
}()
return 0
}