【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

广告
将在 10 秒后关闭
bannerAds