github.com/zly-app/zapp@v1.3.3/pkg/utils/go.go (about)

     1  package utils
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  var Go = goCli{}
     8  
     9  type goCli struct{}
    10  
    11  // 执行等待所有函数完成, 会自动 Recover, 如果有函数执行错误, 会返回第一个不为nil的error
    12  func (goCli) GoAndWait(fns ...func() error) error {
    13  	if len(fns) == 0 {
    14  		return nil
    15  	}
    16  
    17  	var wg sync.WaitGroup
    18  	errChan := make(chan error, len(fns))
    19  
    20  	for _, fn := range fns {
    21  		wg.Add(1)
    22  		go func(fn func() error) {
    23  			defer wg.Done()
    24  			if e := Recover.WrapCall(fn); e != nil {
    25  				errChan <- e
    26  			}
    27  		}(fn)
    28  	}
    29  	wg.Wait()
    30  
    31  	var err error
    32  	select {
    33  	case err = <-errChan:
    34  	default:
    35  	}
    36  	return err
    37  }