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.WaitGroup和go來管理及執行goroutine。
測試
執行結果如下。
2
1
err=[error 1]
沒有留言:
張貼留言