- defer关键字的执行顺序规则:
- 在Go语言中,defer语句会将其后面跟随的语句延迟到包含该defer语句的函数即将返回时执行。
- 多个defer语句,按照后进先出(LIFO,Last In First Out)的顺序执行。例如:
package main
import "fmt"
func main() {
defer fmt.Println("defer 1")
defer fmt.Println("defer 2")
fmt.Println("main function")
}
main function
defer 2
defer 1
- 在函数异常处理场景下defer的作用:
- Go语言中没有传统意义上的try - catch机制,defer与
recover
配合可以实现类似的异常处理功能。recover
只能在defer中使用,用于捕获panic
抛出的异常。例如:
package main
import "fmt"
func divide(a, b int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
if b == 0 {
panic("division by zero")
}
result := a / b
fmt.Println("Result:", result)
}
func main() {
divide(10, 2)
divide(10, 0)
}
- 在上述代码中,
divide
函数用于执行除法运算。当除数为0时,通过panic
抛出异常。defer
语句中的匿名函数使用recover
捕获异常,从而避免程序崩溃。在main
函数中,第一次调用divide(10, 2)
正常执行并输出结果;第二次调用divide(10, 0)
时,panic
被defer
中的recover
捕获,输出“Recovered from panic: division by zero”。