MST

星途 面试题库

面试题:Go goroutine管理中如何处理不同类型的错误

在管理goroutine的过程中,不同的操作(如网络请求、文件读写等)可能会产生各种错误。请说明如何在goroutine中捕获和处理这些错误,并且将错误信息传递到主程序进行统一处理,同时确保goroutine的资源能够正确释放,给出完整的代码示例及解释。
21.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func worker(wg *sync.WaitGroup, resultChan chan error) {
    defer wg.Done()
    // 模拟网络请求或文件读写等操作可能出现的错误
    err := simulateOperation()
    if err != nil {
        resultChan <- err
        return
    }
    resultChan <- nil
}

func simulateOperation() error {
    // 这里简单返回一个错误示例
    return fmt.Errorf("simulated error")
}

func main() {
    var wg sync.WaitGroup
    resultChan := make(chan error)

    wg.Add(1)
    go worker(&wg, resultChan)

    go func() {
        wg.Wait()
        close(resultChan)
    }()

    for err := range resultChan {
        if err != nil {
            fmt.Printf("Error in goroutine: %v\n", err)
        }
    }
}

代码解释:

  1. worker函数

    • 接收一个sync.WaitGroup指针和一个error类型的通道resultChan
    • 使用defer wg.Done()确保goroutine结束时通知WaitGroup
    • 调用simulateOperation模拟可能产生错误的操作。
    • 如果操作产生错误,将错误发送到resultChan,然后返回。
    • 如果没有错误,也向resultChan发送nil
  2. simulateOperation函数

    • 简单返回一个错误,模拟实际操作中的错误情况。
  3. main函数

    • 创建一个sync.WaitGroup和一个error类型的通道resultChan
    • 使用wg.Add(1)表示有一个goroutine需要等待。
    • 启动worker goroutine
    • 使用一个匿名goroutine等待worker goroutine完成,完成后关闭resultChan通道。
    • 通过for... range循环从resultChan通道接收错误信息,并在主程序中进行统一处理。如果接收到非nil的错误,打印错误信息。这样既实现了在goroutine中捕获和处理错误,并将错误信息传递到主程序,同时利用defersync.WaitGroup确保了goroutine资源的正确释放。