一个统一处理出错的技巧

it2025-07-14  11

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

最新回复(0)