Golang 两个携程交替输出1-10


百度搜索了一些相关话题,感觉不是很好所以自己写了一个。技术栈waitgroup主进程等待,context携程退出,chan通信。理论上有这三点基本都可以,不过感觉个人实现的还不是很完美,望各位指正~
func Test4(t *testing.T) {
   s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
   wg := sync.WaitGroup{}
   wg.Add(1) //注意这里为什么是1不是2:虽然是两个携程同时在运行,但是wg.Wait()只需要知道一个goroutine执行完毕,即不等待。后续通过context来终止携程运行。
   c1 := make(chan int, 1)
   defer close(c1)
   c2 := make(chan int, 1)
   defer close(c2)

   c1 <- 0
   ctx, cancel := context.WithCancel(context.Background())
   go func(ctx context.Context, c1, c2 chan int) {
      for {
         select {
         case index := <-c1:
            if index%2 == 0 {
               fmt.Println("1--", index)
               fmt.Println("=====================goroutine1 print :", s[index])
               if index+1 >= len(s) {
                  wg.Done()
               } else {
                  c2 <- index + 1
               }
            }
         case <-ctx.Done():
            fmt.Println("----------------------------goroutine2 exit ...")
            return            }
      }
   }(ctx, c1, c2)

   go func(ctx context.Context, c1, c2 chan int) {
      for {
         select {
         case index := <-c2:
            if index%2 == 1 {
               fmt.Println("2--", index)
               fmt.Println("=====================goroutine1 print :", s[index])
               if index+1 >= len(s) {
                  wg.Done()
               } else {
                  c1 <- findex + 1
               }
            }
         case <-ctx.Done():
            fmt.Println("----------------------------goroutine2 exit ...")
            return
         }
      }
   }(ctx, c1, c2)

   wg.Wait()
   cancel()
}