MST

星途 面试题库

面试题:Go中如何在处理协程时捕获并处理常见错误

在Go语言中,当你启动多个协程来并发处理任务,比如从多个API接口获取数据,假设API接口可能返回错误。请描述如何在主协程中捕获这些协程执行过程中的错误,并给出一个简单的代码示例。
26.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 错误捕获描述
    • 可以使用 sync.WaitGroup 来等待所有协程完成。
    • 为每个协程传递一个 error 类型的 chan,用于发送协程执行过程中的错误。
    • 在主协程中从这些 error chan 中接收错误信息。
  2. 代码示例
package main

import (
    "fmt"
    "sync"
)

// 模拟API调用函数
func callAPI(apiNum int, errChan chan error, wg *sync.WaitGroup) {
    defer wg.Done()
    // 模拟API可能返回错误
    if apiNum == 2 {
        errChan <- fmt.Errorf("API %d returned an error", apiNum)
        return
    }
    // 模拟成功
    fmt.Printf("API %d call success\n", apiNum)
    errChan <- nil
}

func main() {
    var wg sync.WaitGroup
    apiCount := 3
    errChans := make([]chan error, apiCount)
    for i := 0; i < apiCount; i++ {
        errChans[i] = make(chan error)
        wg.Add(1)
        go callAPI(i + 1, errChans[i], &wg)
    }
    go func() {
        wg.Wait()
        for i := 0; i < apiCount; i++ {
            close(errChans[i])
        }
    }()
    for i := 0; i < apiCount; i++ {
        if err := <-errChans[i]; err != nil {
            fmt.Println(err)
        }
    }
}

上述代码启动了多个协程模拟调用API,每个协程将其执行过程中的错误发送到对应的 error chan 中,主协程通过 sync.WaitGroup 等待所有协程完成后,从 chan 中接收错误信息并处理。