《零基础Go语言算法实战》【题目 2-7】defer 关键字特性
《零基础Go语言算法实战》
【题目 2-7】defer 关键字特性
下面代码的输出是什么?请说明原因。
package main
import (
"fmt"
)
func main() {
deferFunc()
func deferFunc() {
defer func() { fmt.Println("value1") }()
defer func() { fmt.Println("value2") }()
defer func() { fmt.Println("value3") }()
panic(" 异常 ")
}
【解答】
value3
value2
value1
panic: 异常
说明:defer 关键字的实现与 go 关键字的实现类似,不同的是它调用的是 runtime.deferproc()
函数而不是runtime.newproc()函数。在defer出现的地方插入了指令调用 runtime.deferproc()函数,
然后在函数返回之前的地方插入指令调用 runtime.deferreturn() 函数。
goroutine 的控制结构中有一张表记录 defer,调用 runtime.deferproc() 函数时会将需要
defer 的表达式记录在表中,而在调用 runtime.deferreturn() 函数时,则会依次从 defer 表中出
栈并执行。因此,题目最后的输出顺序应该是 defer 定义顺序的倒序。panic 异常并不能终止defer 的执行。