MST

星途 面试题库

面试题:Go并发错误处理中的资源管理

在一个使用了goroutine和通道进行并发操作的场景中,某个goroutine负责打开文件资源并处理数据,在处理过程中可能出现错误。当出现错误时,不仅要正确返回错误信息,还要确保文件资源被正确关闭。请编写代码实现该功能,并解释代码中如何避免资源泄漏问题。
34.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "io"
    "os"
)

func processFile(filePath string, resultChan chan<- error) {
    file, err := os.Open(filePath)
    if err != nil {
        resultChan <- err
        return
    }
    defer func() {
        if err := file.Close(); err != nil {
            resultChan <- err
        }
    }()

    // 模拟数据处理
    _, err = io.ReadAll(file)
    if err != nil {
        resultChan <- err
        return
    }

    resultChan <- nil
}

解释如何避免资源泄漏

  1. 使用defer语句:在成功打开文件后,使用defer关键字定义了一个匿名函数,该函数负责关闭文件。defer会在函数返回之前执行,无论函数是正常返回还是因为错误而返回,都能保证文件被关闭,从而避免资源泄漏。
  2. 错误处理:在打开文件和读取文件数据的过程中,一旦发生错误,立即将错误通过通道返回,并直接return结束当前goroutine,确保后续逻辑不会干扰错误处理和文件关闭操作。这样,在任何可能出错的点都能及时处理并关闭文件资源,防止资源泄漏。

调用示例

func main() {
    resultChan := make(chan error)
    go processFile("nonexistentfile.txt", resultChan)
    err := <-resultChan
    close(resultChan)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("File processed successfully")
    }
}