MST

星途 面试题库

面试题:Go语言中异常恢复与资源管理在复杂场景下的应用

在一个Go语言的大型项目中,涉及到数据库连接、文件操作等多种资源的使用。假设在执行一个复杂业务逻辑的过程中可能会触发panic异常,这个异常不仅要进行恢复,还需要保证各种资源能够正确释放,避免资源泄漏。请阐述你在设计这样的异常恢复与资源管理策略时的思路,并给出关键部分的代码示例。
37.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 资源管理:使用Go语言的defer关键字来确保在函数结束时释放资源。无论是正常结束还是因为panic异常结束,defer语句都会执行,从而保证数据库连接、文件句柄等资源被正确关闭。
  2. 异常恢复:在函数中使用recover函数来捕获panic异常。将可能引发panic的代码块放在defer语句调用recover的函数之前,这样当panic发生时,recover可以捕获到该异常,进行相应处理。

代码示例

package main

import (
    "fmt"
    "os"
)

// 模拟数据库连接
type Database struct {
    // 实际连接对象等属性
}

func (db *Database) Connect() {
    fmt.Println("Database connected")
}

func (db *Database) Disconnect() {
    fmt.Println("Database disconnected")
}

// 模拟复杂业务逻辑函数
func complexBusinessLogic() {
    var db Database
    db.Connect()
    defer db.Disconnect()

    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("Failed to open file:", err)
        return
    }
    defer file.Close()

    // 模拟可能引发 panic 的代码
    panic("Simulated panic")

    // 后续代码不会执行,因为已经 panic
    fmt.Println("Business logic completed")
}

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

    complexBusinessLogic()
    fmt.Println("Main function continues")
}

在上述代码中:

  • complexBusinessLogic函数中,使用defer确保数据库连接db在函数结束时断开连接,文件file在函数结束时关闭。
  • main函数中,通过deferrecover捕获并处理complexBusinessLogic函数中可能发生的panic异常。这样既保证了资源的正确释放,又实现了异常的恢复。