1、写出下面代码的输出
package main import "fmt" func main() { defer_all() panic("触发异常") } func defer_all() { defer func() { fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func() { fmt.Println("打印后") }() }
解析:这道题主要考察的是对 defer 的理解,defer 主要是延迟函数,延迟到调用者函数执行 return 命令之前,
多个 defer 之前按照先进后出的顺序执行,所以,这道题中,在 panic 触发时结束函数运行,在 return 之前依次打
印:打印后、打印中、打印前。最后 runtime 运行时抛出打印 panic 异常信息
需要注意的是,函数的 return value 不是原子操作,而是在编译器中被分解成两部分:返回值和return,而我们
知道 defer 是在 return 之前执行的,所以可以在 defer 函数中修改返回值,如下示例:
package main import ( "fmt" ) func main() { fmt.Println(doubleScore(0)) //0 fmt.Println(doubleScore(20.0)) //40 fmt.Println(doubleScore(50.0)) //50 } func doubleScore(source float32) (score float32) { defer func() { if score < 1 || score >= 100 { //将影响返回值 score = source } }() score = source * 2 return //或者 //return source * 2 }
持续更新。。。。。。