panic 也可被称为运行时恐慌,是一种只能在程序运行期间抛出的程序异常。如果不处理,panic 就会导致程序崩溃并终止运行。
recover 专用于恢复 panic。
defer 语句是被用来延迟执行代码的,延迟到语句所在函数即将结束的那一刻。
package main
import (
"fmt"
"errors"
)
func main() {
fmt.Println("Enter function main.")
// 尽量将 defer 语句写在函数体开始处
// 因为在引发 panic 的语句之后的所有语句都不会执行
defer func() {
fmt.Println("Enter defer function.")
// recover 只有在 defer 中才能起作用
if p := recover(); p != nil {
fmt.Printf("painc: %s\n", p)
}
fmt.Println("Exit defer function.")
}()
// 引发 panic
panic(errors.New("something wrong"))
fmt.Println("Exit function main.")
}
同一个函数中,defer 函数的调用的执行顺序与它们分别所属的 defer 语句的出现顺序完全相反。
当一个函数即将结束时,写在最下边的 defer 函数调用会最先执行。
package main
import (
"fmt"
)
func main() {
defer fmt.Println("first defer")
for i := 0; i < 3; i++ {
defer fmt.Println("defer in for [%d]\n", i)
}
defer fmt.Println("last defer")
}