MST

星途 面试题库

面试题:Go事件驱动模型下的资源管理

假设你正在使用Go构建一个复杂的事件驱动系统,其中涉及到多个资源,如数据库连接、文件句柄等。在事件处理过程中,如何有效地管理这些资源以避免资源泄漏?如果某些资源初始化失败,如何保证系统的整体健壮性并及时清理已分配的资源?请结合代码示例阐述你的思路。
15.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go中管理资源以避免泄漏并保证系统健壮性,可利用defer语句和错误处理机制。以下以数据库连接和文件句柄为例。

  1. 使用defer关闭资源defer语句可确保函数返回前执行某些操作,常用于关闭资源。
  2. 错误处理与资源清理:在初始化资源时,若某一资源初始化失败,要清理已成功初始化的资源。

示例代码如下:

package main

import (
    "database/sql"
    "fmt"
    "os"

    _ "github.com/lib/pq" // 以PostgreSQL为例,实际按需求替换
)

func main() {
    // 初始化数据库连接
    db, err := sql.Open("postgres", "user=test dbname=test sslmode=disable")
    if err != nil {
        fmt.Println("Failed to open database:", err)
        return
    }
    defer db.Close()

    // 测试数据库连接
    err = db.Ping()
    if err != nil {
        fmt.Println("Failed to ping database:", err)
        return
    }

    // 打开文件
    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("Failed to open file:", err)
        // 若文件打开失败,关闭数据库连接
        db.Close()
        return
    }
    defer file.Close()

    // 这里开始处理事件,假设事件处理代码如下
    fmt.Println("Resources initialized successfully. Starting event handling...")
    // 模拟事件处理逻辑
    //...
}

在上述代码中:

  • 数据库连接使用sql.Open打开,使用defer db.Close()确保函数结束时关闭连接。
  • 文件使用os.Open打开,同样使用defer file.Close()确保关闭。
  • 若文件打开失败,手动关闭已打开的数据库连接,保证资源不泄漏,维护系统健壮性。