在下面的代码块中,我试图运行几个例程并为所有例程获取结果(无论是成功还是错误)。
package main
import (
"fmt"
"sync"
)
func processBatch(num int, errChan chan<- error, resultChan chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
if num == 3 {
resultChan <- 0
errChan <- fmt.Errorf("goroutine %d's error returned", num)
} else {
square := num * num
resultChan <- square
errChan <- nil
}
}
func main() {
var wg sync.WaitGroup
batches := [5]int{1, 2, 3, 4, 5}
resultChan := make(chan int)
errChan := make(chan error)
for i := range batches {
wg.Add(1)
go processBatch(batches[i], errChan, resultChan, &wg)
}
var results [5]int
var err [5]error
for i := range batches {
results[i] = <-resultChan
err[i] = <-errChan
}
wg.Wait()
close(resultChan)
close(errChan)
fmt.Println(results)
fmt.Println(err)
}
游乐场:https ://go.dev/play/p/zA-Py9gDjce 此代码有效,我得到了我想要的结果,即:
[25 1 4 0 16]
[<nil> <nil> <nil> goroutine 3's error returned <nil>]
我想知道是否有更惯用的方法来实现这一目标。我浏览了 errgroup 包:https ://pkg.go.dev/golang.org/x/sync/errgroup但没能在这里找到对我有帮助的东西。欢迎提出任何建议。
慕工程0101907
SMILET
随时随地看视频慕课网APP
相关分类