MST

星途 面试题库

面试题:Go 中defer的执行顺序及应用场景

请阐述在 Go 语言中,多个defer语句的执行顺序是怎样的?并举例说明至少两个defer语句常见的应用场景。
18.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 多个defer语句的执行顺序: 在Go语言中,多个defer语句的执行顺序是后进先出(LIFO),即最后声明的defer语句最先执行。这是因为defer语句会被压入一个栈中,函数结束时从栈中弹出并执行。
  2. 应用场景
    • 资源清理: 例如在处理文件操作时,打开文件后需要关闭文件以释放资源。使用defer可以确保无论函数如何结束(正常返回或发生错误),文件都能被正确关闭。
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()

    // 这里进行文件读取等操作
    //...
}
  • 捕获panic并处理: 可以使用defer结合recover函数来捕获并处理程序运行过程中发生的panic,避免程序直接崩溃。
package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    panic("Simulating a panic")
}