MST

星途 面试题库

面试题:Go语言中defer关键字的执行顺序及场景应用

请阐述Go语言中defer关键字的执行顺序规则,并举例说明在函数异常处理场景下,defer是如何发挥作用的。
26.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 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
  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)时,panicdefer中的recover捕获,输出“Recovered from panic: division by zero”。