不管是哪种编程语言,重新发明轮子都不是一个好主意。代码库重新实现如何启动多个goroutine并汇总错误也很常见。但是Go生态系统中的一个包旨在支持这种常见的用例。让我们来看看这个包并了解为什么它应该成为Go开发人员工具集的一部分。
golang.org/x是一个为标准库提供扩展的存储库。sync子存储库包含一个方便的包: errgroup。
假设我们必须处理一个函数,并且接收一些想要用来调用外部服务的数据作为参数。由于限制,不能只调用一次,我们依次使用不同的子集进行多次调用。此外,这些调用是并行运行的,如下图所示:
如果在调用过程中出现一个错误,我们希望将其返回。如果出现多个错误,我们只想返回其中一个。让我们只使用标准并发原语来编写实现的提纲:
func handler(ctx context.Context, circles []Circle) ([]Result, error) {
results := make([]Result, len(circles))
wg := sync.WaitGroup{}
wg.Add(len(results))
for i, circle := range circles {
i := i
circle := circle
go func() {
defer wg.Done()
result, err := foo(ctx, circ