MST
星途 面试题库

面试题:Go中defer与异常处理及资源管理

在一个Go语言程序中,需要读取一个文件的内容,在读取完成后关闭文件。要求使用defer来确保文件被正确关闭,同时考虑在读取文件过程中可能出现的错误情况(如文件不存在等)。请编写一个完整的函数实现此功能,并详细解释defer在这个过程中是如何与错误处理协同工作的,以及在不同错误情况下defer语句的执行情况。
30.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "os"
)

func readFileContent(filePath string) (string, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return "", err
    }
    defer file.Close()

    var content []byte
    content, err = os.ReadFile(filePath)
    if err != nil {
        return "", err
    }

    return string(content), nil
}

defer与错误处理协同工作解释

  1. 打开文件:首先使用os.Open尝试打开文件,如果打开文件时发生错误(如文件不存在),函数直接返回错误,此时defer语句不会执行,因为函数提前返回了。
  2. defer语句:在成功打开文件后,使用defer关键字注册file.Close()语句。defer会在当前函数返回(无论是正常返回还是因错误返回)时执行。这确保了无论后续读取文件过程中是否发生错误,文件都会被关闭。
  3. 读取文件:接着使用os.ReadFile读取文件内容,如果读取过程中发生错误,函数返回错误,但此时defer注册的file.Close()语句依然会执行,保证文件资源的正确释放。

不同错误情况下defer语句执行情况

  • 文件打开错误:如文件不存在、权限不足等,os.Open返回错误,函数直接返回,defer注册的关闭文件语句不会执行,因为还未进入到defer注册语句之后的代码。
  • 文件读取错误:文件成功打开,但在os.ReadFile读取时发生错误,函数返回错误,此时defer注册的file.Close()语句会执行,确保文件关闭,避免资源泄漏。