我们经常会启动多个协程处理问题,在错误处理的时候,我们通常的做法就是定义一个chann,如果发生了错误,就发生到chann里面。然后再启动一个协程去读这个chann,从而判断是否有协程运行报错。
但这种方式写法上比较麻烦,其实在Go里面有一种更加优雅的方式处理错误,errgroup。代码如下:
func main() {
var g errgroup.Group
var urls = []string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.somestupidname.com/",
}
for _, url := range urls {
url := url // 闭包处理
g.Go(func() error {
// 请求URL
resp, err := http.Get(url)
if err == nil {
resp.Body.Close()
}
return err
})
}
// 等待所有协程执行完毕
if err := g.Wait(); err == nil {
fmt.Println("Successfully fetched all URLs.")
}
}
上面通过errgroup简化了代码,如果有一个协程返回报错,wait 方法就可以获取返回的err。非常方便。