MST

星途 面试题库

面试题:Go中如何在并发环境下优雅地处理错误

在Go语言中,假设你有多个goroutine并发执行任务,每个任务可能会返回错误。请描述一种方法,能够收集所有goroutine执行过程中的错误,并在所有任务完成后统一处理这些错误。要求使用Go的标准库和常用的并发编程模式。
26.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用 sync.WaitGroupchan 实现
    • 可以利用 sync.WaitGroup 来等待所有的 goroutine 完成,同时使用一个 chan 来收集每个 goroutine 执行过程中返回的错误。
    • 以下是示例代码:
package main

import (
    "fmt"
    "sync"
)

func task(i int) error {
    // 模拟可能出错的任务
    if i == 2 {
        return fmt.Errorf("task %d failed", i)
    }
    return nil
}

func main() {
    var wg sync.WaitGroup
    errorChan := make(chan error)
    numTasks := 3

    for i := 0; i < numTasks; i++ {
        wg.Add(1)
        go func(taskID int) {
            defer wg.Done()
            err := task(taskID)
            if err != nil {
                errorChan <- err
            }
        }(i)
    }

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

    var errors []error
    for err := range errorChan {
        errors = append(errors, err)
    }

    if len(errors) > 0 {
        fmt.Println("Encountered errors:")
        for _, err := range errors {
            fmt.Println(err)
        }
    } else {
        fmt.Println("All tasks completed successfully")
    }
}
  1. 代码说明
    • 任务函数 task:模拟了一个可能返回错误的任务。这里简单地设置当 i 等于 2 时返回错误。
    • main 函数
      • 首先创建了一个 sync.WaitGroup 和一个用于收集错误的 errorChan
      • 通过循环启动多个 goroutine,每个 goroutine 执行 task 函数,并在完成后调用 wg.Done()。如果 task 执行出错,将错误发送到 errorChan
      • 使用一个单独的 goroutine 等待所有 goroutine 完成(wg.Wait()),然后关闭 errorChan
      • 最后通过 for... rangeerrorChan 中读取所有错误,并统一进行处理。如果有错误,打印错误信息;如果没有错误,打印任务成功完成的消息。