具有自定义签名的Golang错误分组结束功能

时间:2020-02-07 14:44:22

标签: 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
   })

2 个答案:

答案 0 :(得分:2)

@mkopriva提出的答案。

var g errgroup.Group
var x interface{}

g.Go(func() error {
   return foo(x)
})

简单。

答案 1 :(得分:0)

正如@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 {
        //
    }
}

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