Golang 中 defer panic recover 简单使用
Golang defer、panic、recover
defer
defer 语句用于延迟执行一个函数调用,直到包含该 defer 语句的函数执行完毕。defer 语句通常用于释放资源、关闭文件、解锁互斥锁等操作。
defer 语句的执行顺序是后进先出,即最后被 defer 的语句最先执行。例如:
func main() {
defer fmt.Println("defer 1")
defer fmt.Println("defer 2")
defer fmt.Println("defer 3")
fmt.Println("main")
}
输出结果为:
main
defer 3
defer 2
defer 1
panic
panic 是 Go 语言中的一个内置函数,用于触发一个运行时错误。当程序执行到 panic 函数时,会立即停止当前函数的执行,并开始执行该函数中所有 defer 语句。然后,程序会沿着调用栈向上传播 panic,直到找到一个 recover 函数来捕获 panic,或者程序终止。
panic 函数通常用于处理不可恢复的错误,例如数组越界、空指针引用等。
recover 是 Go 语言中的一个内置函数,用于捕获 panic。当程序执行到 recover 函数时,会停止 panic 的传播,并返回 panic 的值。如果程序没有 panic,则 recover 函数返回 nil。
recover 函数通常用于处理 panic,例如在 defer 语句中捕获 panic,并执行一些清理操作。例如:
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println("panic:", err)
} else {
fmt.Println("no panic")
}
}()
panic("something wrong")
}
输出结果为:
panic: something wrong
注:panic 后面的语句都不会在执行包括调用的函数
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println("main recover", err)
}
}()
c := testPanic(3, 3)
fmt.Println("继续执行", c)
}
func testPanic(a int, b int) (t int) {
if a%b == 0 {
panic("error ---------")
} else {
return a % b
}
}
输出结果为:
main recover error ---------