Go的goroutine函式因為是另個thread所以無法將錯誤以return
回傳到main goroutine,因此可利用Channel來將錯誤(或其他結果)回傳到main goroutine。
範例
下面程式中建立一個型別為error
的unbuffered channel變數forever
。在另一個goroutine中當錯誤發生時以forever <- error
將錯誤發送至forever
,然後在main goroutine以<-forever
接收並印出。<-forever
在收到錯誤訊息以前會阻塞,也就是main goroutine執行到這時會卡住,直到另一goroutine中傳入錯誤到forever
channel後才會解除阻塞並往下執行。
main.go
package main
import (
"fmt"
)
func main() {
limit := 3
forever := make(chan error)
go func() {
count := 0
for {
if count <= limit {
fmt.Printf("count=%d\n", count)
count++
} else {
forever <- fmt.Errorf("count exceed limit=%d", limit)
}
}
}()
err := <-forever
close(forever)
fmt.Println(err)
}
測試
程式執行印出以下結果。
count=0
count=1
count=2
count=3
count exceed limit=3
除了Channel,或可使用errgroup.Group
來取得錯誤,參考「Golang 使用errgroup.Group取得goroutine錯誤」。
沒有留言:
張貼留言