面试题答案
一键面试设计思路
- 使用
sync.WaitGroup
:用于等待所有 goroutine 完成任务。 - 错误通道:创建一个通道,用于各个 goroutine 发送错误信息。
- 汇总错误:在主 goroutine 中,从错误通道接收错误并汇总到一个切片中。
核心代码实现
package main
import (
"fmt"
"sync"
)
func task(id int, wg *sync.WaitGroup, errCh chan error) {
defer wg.Done()
// 模拟任务执行
if id == 2 {
errCh <- fmt.Errorf("task %d failed", id)
return
}
fmt.Printf("task %d completed successfully\n", id)
}
func main() {
var wg sync.WaitGroup
errCh := make(chan error)
tasks := 3
for i := 1; i <= tasks; i++ {
wg.Add(1)
go task(i, &wg, errCh)
}
go func() {
wg.Wait()
close(errCh)
}()
var errors []error
for err := range errCh {
errors = append(errors, err)
}
if len(errors) > 0 {
fmt.Println("汇总错误:")
for _, err := range errors {
fmt.Println(err)
}
} else {
fmt.Println("所有任务均成功完成")
}
}
在上述代码中:
task
函数模拟一个任务,它接收任务编号、WaitGroup
指针和错误通道。任务完成后,通过wg.Done()
通知WaitGroup
任务已完成。如果任务失败,向错误通道发送错误。- 在
main
函数中,创建WaitGroup
和错误通道,并启动多个 goroutine 执行任务。 - 使用一个 goroutine 等待所有任务完成后关闭错误通道。
- 主 goroutine 从错误通道接收错误并汇总到
errors
切片中,最后根据是否有错误输出相应信息。这种方法在性能和资源消耗方面较为平衡,能够有效捕获和汇总所有 goroutine 中的错误。