面试题答案
一键面试- 代码实现思路:
- 定义一个结构体来包装错误,结构体中包含错误本身以及错误来源的标识。
- 每个goroutine将其执行任务产生的错误包装后通过Channel发送。
- 主goroutine从Channel中接收这些错误,并进行统一处理。
- 关键代码片段:
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... range
从errorCh
接收错误并处理,能够区分不同任务的错误来源。