我在一个循环中有一个goroutine,我处理错误的方式是,我将其添加到一个通道,在所有goroutines完成后,我检查是否有错误,然后相应地返回。
这样做的问题是,我想在收到错误后立即返回错误,这样我就不会花时间等待所有goroutines完成,因为它效率低下。
我尝试添加语句,但它不起作用,我无法在goroutines中添加语句,因为我也想退出for循环和函数。selectselecttry
我该怎么做?
代码如下:
package main
import (
"sync"
"runtime"
"fmt"
"errors"
)
func try() (bool, error) {
wg := new(sync.WaitGroup)
s := []int{0,1,2,3,4,5}
ec := make(chan error)
for i, val := range s {
/*
select {
case err, ok := <-ec:
if ok {
println("error 1", err.Error())
return false, err
}
default:
}
*/
wg.Add(1)
i := i
val := val
go func() {
err := func(i int, val int, wg *sync.WaitGroup) error {
defer wg.Done()
if i == 3 {
return errors.New("one error")
} else {
return nil
}
}(i, val, wg)
if err != nil {
ec <- err
return
}
}()
}
wg.Wait()
select {
case err, ok := <-ec:
if ok {
println("error 2", err.Error())
return false, err
}
default:
}
return true, nil
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
b, e := try()
if e != nil {
fmt.Println(e.Error(), b)
}
}
繁星淼淼
紫衣仙女
相关分类