您应该为错误和结果创建两个通道,然后,如果没有错误,则先读取错误,然后再读取结果,此示例适用于您的用例:
package mainimport ( "errors" "sync")func test(i int) (int, error) { if i > 2 { return 0, errors.New("test error") } return i + 5, nil}func test2(i int) (int, error) { if i > 3 { return 0, errors.New("test2 error") } return i + 7, nil}func main() { results := make(chan int, 2) errors := make(chan error, 2) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() result, err := test(3) if err != nil { errors <- err return } results <- result }() wg.Add(1) go func() { defer wg.Done() result, err := test2(3) if err != nil { errors <- err return } results <- result }() // here we wait in other goroutine to all jobs done and close the channels go func() { wg.Wait() close(results) close(errors) }() for err := range errors { // here error happend u could exit your caller function println(err.Error()) return } for res := range results { println("--------- ", res, " ------------") }}


