package main
import (
"fmt"
"sync"
)
type WaitGroupWrapper struct {
sync.WaitGroup
}
func (w *WaitGroupWrapper) Wrap(cb func()) {
w.Add(1)
go func() {
cb()
w.Done()
}()
}
func test1() error {
fmt.Println("test1")
return nil
}
func test2() error {
fmt.Println("test2")
//return errors.New("test2 error")
return nil
}
func main() {
exitCh := make(chan error)
var once sync.Once
exitFunc := func(err error) {
once.Do(func() {
if err != nil {
fmt.Println("error happen")
}
exitCh <- err //阻塞
})
}
w := &WaitGroupWrapper{}
w.Wrap(func() {
exitFunc(test1())
})
w.Wrap(func() {
exitFunc(test2())
})
err := <-exitCh
if err != nil {
fmt.Println(err)
return
}
w.Wait()
fmt.Println("nomal exit")
return
}
两个函数都没出错,输出
test2
test1
nomal exit
如果test2改成return errors.New(“test2 error”),出错了,输出
test2
error happen
test1
test2 error
这里很奇怪的一个点,是exitfunc函数只会执行一次,谁先执行了,后面的就不会再执行了,莫非他是默认失败的函数一定比成功的函数先返回?