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]
沒有留言:
張貼留言