顺序

defer 的调用顺序类似于栈,后定义的先调用

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 表中出栈并执行

例子1

func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}