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 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函数只会执行一次,谁先执行了,后面的就不会再执行了,莫非他是默认失败的函数一定比成功的函数先返回?