AdSense

網頁

2024/6/24

Golang 使用errgroup.Group取得goroutine錯誤

Go的goroutine是另一條執行緒所以無法將錯誤以return回傳到main goroutine,除了利用channel取得錯誤,也可利用errgroup.Group來將錯誤回傳到main goroutine。


範例環境:

  • Go 1.21


安裝

在專案根目錄以命令列執行go get golang.org/x/sync/errgroup安裝errgroup package。


範例

建立一個errgroup.Group物件。

使用errgroup.Group執行goroutine時,不是用go關鍵字,而是用errgroup.Group.Go來執行goroutine,且執行的函式只能是func() error

errgroup.Group.Go的goroutine函式回傳的錯誤,之後可以errgroup.Group.Wait取出錯誤。若有多個goroutine回傳錯誤,則只會取得第一個回傳的錯誤。

main.go

package main

import (
    "fmt"

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

func main() {
    eg := new(errgroup.Group)

    eg.Go(func() error {
        fmt.Println("1")
        return fmt.Errorf("error 1")
    })

    eg.Go(func() error {
        fmt.Println("2")
        return fmt.Errorf("error 2")
    })

    err := eg.Wait()
    if err != nil {
        fmt.Printf("err=[%s]\n", err)
    }

}

errgroup.Group.Go原始碼可以看到,其實也是利用sync.WaitGroupgo來管理及執行goroutine。


測試

執行結果如下。

2
1
err=[error 1]


沒有留言:

AdSense