MST

星途 面试题库

面试题:Go语言defer在资源管理中的应用

假设你正在开发一个需要频繁打开和关闭文件的Go程序,为了避免文件资源泄漏,如何使用defer语句来优雅地管理文件资源?请写出具体的代码示例,并解释在函数执行不同路径(正常结束、发生错误等)时,defer是如何确保文件正确关闭的。
42.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

以下是Go语言中使用defer语句管理文件资源的示例代码:

package main

import (
    "fmt"
    "os"
)

func readFileContents(filePath string) ([]byte, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    data, err := os.ReadFile(filePath)
    if err != nil {
        return nil, err
    }
    return data, nil
}

解释

  1. 正常结束

    • 当函数readFileContents正常执行到末尾,没有发生错误时,defer语句会在函数返回之前执行。这里defer file.Close()会确保在函数返回前关闭打开的文件,即使在os.ReadFile成功读取文件内容之后,文件依然会被正确关闭,防止资源泄漏。
  2. 发生错误

    • 如果在os.Open时发生错误,函数会直接返回错误。但由于defer语句的特性,file.Close()依然会被执行。然而,因为os.Open失败,filenil,Go语言中对nil的文件对象调用Close方法是安全的,不会导致程序崩溃,依然能确保不会因为未关闭文件而造成资源泄漏。
    • 如果在os.ReadFile时发生错误,函数同样会返回错误。但在返回之前,defer语句(即file.Close())会先执行,关闭之前打开的文件,保证资源的正确释放。