MST

星途 面试题库

面试题:Go异步回调中的错误处理与资源管理

在Go的并发编程异步回调场景下,如果`process`函数不仅返回计算结果,还可能返回一个错误(例如在进行网络请求或文件读取等操作时)。请说明如何设计异步回调机制,既能正确处理返回结果,又能优雅地处理错误。同时,假设`process`函数内部申请了一些资源(如打开了文件描述符),需要在任务完成后释放这些资源,如何确保资源在各种情况下(包括错误发生时)都能正确释放?给出详细的设计思路和代码示例。
26.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用goroutinechannel:利用goroutine实现异步执行process函数,通过channel来传递结果和错误信息。
  2. 资源管理:在process函数内部使用defer关键字来确保资源在函数结束时(无论正常结束还是发生错误)被释放。
  3. 异步回调处理:在goroutine外部通过监听channel来获取结果或错误,并进行相应处理。

代码示例

package main

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

// process 模拟一个可能返回错误并申请资源的函数
func process() (string, error) {
    // 打开文件模拟申请资源
    file, err := os.Open("example.txt")
    if err != nil {
        return "", err
    }
    defer file.Close() // 使用defer确保文件在函数结束时关闭

    data, err := io.ReadAll(file)
    if err != nil {
        return "", err
    }
    return string(data), nil
}

func main() {
    resultCh := make(chan string, 1)
    errCh := make(chan error, 1)

    go func() {
        result, err := process()
        if err != nil {
            errCh <- err
            return
        }
        resultCh <- result
    }()

    select {
    case result := <-resultCh:
        fmt.Println("处理结果:", result)
    case err := <-errCh:
        fmt.Println("发生错误:", err)
    }
}

在上述代码中:

  • process函数打开一个文件并读取其内容,使用defer确保文件在函数结束时关闭。
  • main函数创建两个channelresultCh用于传递处理结果,errCh用于传递错误。
  • 通过goroutine异步执行process函数,根据执行结果向不同的channel发送数据。
  • main函数通过select语句监听这两个channel,以优雅地处理结果和错误。