具有自定义签名的函数上的 Golang 错误组

Wil*_*man 3 go goroutine

比如说,我有一个函数,func foo(x) error { if x == y ... return err}我想在多个 go 例程中执行并聚合错误(最好使用错误组,如下面的常见示例),但不确定这是否可能?

   import "golang.org/x/sync/errgroup"

   var g errgroup.Group

   g.Go(func() error {
      resp, err := http.Get(url)
      if err == nil {
         resp.Body.Close()
      }
      return err
   })
Run Code Online (Sandbox Code Playgroud)

ngu*_*890 8

正如 @Homulvas 在评论中指出的那样,如果您将循环中的参数传递给 go 例程(这会产生封装函数),这是一个可怕的想法。以下是重现上述问题的链接(来自 Homulvas):https://play.golang.org/p/Jvo_0LI8AxO

看来你想通过 go 例程扫描 url 列表,所以仅供参考,要修复它,你可以在循环中声明一个 func 来初始化 go 例程以查找错误,如下所示:

package main

import (
    "fmt"
    "golang.org/x/sync/errgroup"
)

func scan(x string) error {
    // if x == y ... return err
    fmt.Println(x)
    return nil
}

func main() {
    var g errgroup.Group
    urls := []string{"a.com", "b.com", "c.com", "d.com"}
    for _, url := range urls {
        func(scanningUrl string) {
            g.Go(func() error {
                return scan(scanningUrl)
            })
        }(url)
    }

    if err := g.Wait(); err != nil {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

链接: https: //play.golang.org/p/XtfD1AFsdYt