MST
星途 面试题库

面试题:Go中利用Channel实现复杂错误处理流程

假设有多个goroutine并行执行不同的任务,每个任务都可能返回不同类型的错误。请设计一个方案,通过Channel将这些错误收集起来,并在主goroutine中统一处理,同时要确保能够区分不同任务的错误来源。请给出详细的代码实现思路及关键代码片段。
38.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 代码实现思路
    • 定义一个结构体来包装错误,结构体中包含错误本身以及错误来源的标识。
    • 每个goroutine将其执行任务产生的错误包装后通过Channel发送。
    • 主goroutine从Channel中接收这些错误,并进行统一处理。
  2. 关键代码片段
package main

import (
    "fmt"
)

// 定义用于包装错误的结构体
type ErrorWithSource struct {
    Err     error
    Source  string
}

func main() {
    // 创建一个用于接收错误的Channel
    errorCh := make(chan ErrorWithSource)

    // 模拟多个goroutine执行任务
    go func() {
        // 模拟任务1
        err := doTask1()
        if err != nil {
            errorCh <- ErrorWithSource{Err: err, Source: "Task1"}
        }
        close(errorCh)
    }()

    go func() {
        // 模拟任务2
        err := doTask2()
        if err != nil {
            errorCh <- ErrorWithSource{Err: err, Source: "Task2"}
        }
    }()

    // 主goroutine统一处理错误
    for err := range errorCh {
        fmt.Printf("Error from %s: %v\n", err.Source, err.Err)
    }
}

func doTask1() error {
    // 实际任务1的逻辑,这里简单返回一个错误模拟
    return fmt.Errorf("task1 error")
}

func doTask2() error {
    // 实际任务2的逻辑,这里简单返回一个错误模拟
    return fmt.Errorf("task2 error")
}

在上述代码中:

  • ErrorWithSource结构体用于包装错误和标识错误来源。
  • 多个匿名goroutine模拟不同任务执行,并将错误通过errorCh发送。
  • 主goroutine通过for... rangeerrorCh接收错误并处理,能够区分不同任务的错误来源。