原题目
下面这段代码输出的内容
package main
import (
"fmt"
)
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
panic("触发异常")
}
题目的主要考察点在defer和golang的异常处理。
defer是golang中的关键字,用于延迟关键字之后函数的执行,这个时机在调用函数返回后。defer常用于清理释放资源、执行 recover。当有多个defer语句时,采取后进先出 LIFO的执行顺序,和栈的使用方式一致。
panic、recover都是golang的异常处理方法。panic 用来表示非常严重的不可恢复的错误的,如果执行的时候遇到panic,程序会中断运行,并立即执行在该goroutine(可以先理解成线程)中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。有点类似与try catch finally中的finally。
所以最后的打印结果是:
[Running] go run "/home/revo/workspace/go/src/goweb/main.go"
打印后
打印中
打印前
panic: 触发异常
goroutine 1 [running]:
main.defer_call()
/home/revo/workspace/go/src/goweb/main.go:16 +0x91
main.main()
/home/revo/workspace/go/src/goweb/main.go:8 +0x20
exit status 2
有疑问加站长微信联系(非本文作者)