Golang 怎么在并发编程中等待多个 goroutine 结束?

参考解析

题目来源: 小米

答案:

  1. 使用channel
  1. func main() {
  2. ch := make(chan struct{}, 10)
  3. for i := 0; i < 10; i++ {
  4. go func() {
  5. fmt.Println("do work...")
  6. ch <- struct{}{}
  7. }()
  8. }
  9. for i := 0; i < 10; i++ {
  10. <-ch
  11. }
  12. close(ch)
  13. fmt.Println("work finish")
  14. }

2.使用sync.waitgroup ,errgroup的功能更加强大能够捕获协程中的错误。

  1. func main(){
  2. var wg sync.WaitGroup
  3. wg.Add(10)
  4. for i := 0; i < 10; i++ {
  5. go func() {
  6. fmt.Println("do work...")
  7. wg.Done()
  8. }()
  9. }
  10. wg.Wait()
  11. fmt.Println("work finish")
  12. }

3.使用errgroup.Group 相比waitgroup它的功能更加强大能够捕获协程中的错误

  1. func main(){
  2. group := new(errgroup.Group)
  3. for i := 0; i < 5; i++ {
  4. i := i
  5. group.Go(func() error {
  6. if i >= 3 {
  7. return fmt.Errorf("num can not great 2 %v", i)
  8. }
  9. fmt.Println(i)
  10. return nil
  11. })
  12. }
  13. if err := group.Wait(); err != nil {
  14. fmt.Println(err)
  15. }
  16. fmt.Println("work finish")
  17. }