【errorgroup】Golang中并行处理时处理错误的注意事项
总结
如果想要进行Golang的并发处理并处理错误,可以使用errorgroup包。
GoDoc链接在这里:
https://godoc.org/golang.org/x/sync/errgroup
暂时尝试实现(返回未预期的值的例子)。
import "golang.org/x/sync/errgroup"
var g errgroup.Group
for _, url := range urls {
g.Go(func() error {
// Fetch the URL.
resp, err := http.Get(url)
if err == nil {
resp.Body.Close()
}
return err
})
}
以这种方式写的话,只会引用urls末尾的元素,无法按预期工作。为什么会这样呢?
根据阅读GoDoc,可以在下文中找到以下示例代码(已在后文中记录)。
按照预期正常运行的例子
import "golang.org/x/sync/errgroup"
var g errgroup.Group
for _, url := range urls {
// Launch a goroutine to fetch the URL.
url := url // https://golang.org/doc/faq#closures_and_goroutines <- この代入の意味はなんだろう :thinking_face:
g.Go(func() error {
// Fetch the URL.
resp, err := http.Get(url)
if err == nil {
resp.Body.Close()
}
return err
})
}
点击评论中的链接(https://golang.org/doc/faq#closures_and_goroutines),可以找到以下的文本和示例代码。
更简单的方法是创建一个新的变量,使用一种在Go中可能看起来奇怪的声明方式,但却运行良好。
当按照这样的描述方式写作时,可以更加简单地表达。
回顾这种语言行为,不为每次迭代定义新变量,可能是一个错误。它可能在以后的版本中修正,但为了兼容性,无法在Go 1版本中改变。
在迭代过程中定义新的值,虽然从语言规范来看是错误的,但在Go的1版本中无法修复。
总结
在errorgroup中,似乎只能采取这次迭代的方法。
因此,请在迭代过程中注意使用错误组。
相关文章
我写完这篇文章后发现之前已经有类似内容的文章发布了,所以给各位附上链接。
https://qiita.com/sudix/items/67d4cad08fe88dcb9a6d