方法一:使用两个channel

CAfatal error: all goroutines are asleep - deadlock!
CA
package main

import (
	"fmt"
	"sync"
)


var wg sync.WaitGroup
var CA chan int
var CB chan int

func main(){
	wg = sync.WaitGroup{}
	CA = make(chan int,1)
	CB = make(chan int)
	wg.Add(2)

	go A()
	go B()
	CA<-1
	wg.Wait()

}

func A(){

	for i:=0;i<5;i++{
		<-CA
		fmt.Println(2*i)
		CB<-1
	}
	wg.Done()

}

func B(){

	for i:=0;i<5;i++{
		<-CB
		fmt.Println(2*i+1)
		CA<-1
	}
	wg.Done()

}

方法二 :使用一个channel

使用无缓冲的channel,使两个协程同步,按照相同的步调执行,但因为要交替打印所以不能每次同步后都打印,要让该输出的协程输出,不该输出的协程不输出

package main

import (
   "fmt"
   "sync"
)

var wg sync.WaitGroup
var CA chan int

func main(){
   wg = sync.WaitGroup{}
   CA = make(chan int)

   wg.Add(2)

   go A()
   go B()
   wg.Wait()

}

func A(){

   for i:=0;i<10;i++{
      CA<-1
      if i%2 == 0{
         fmt.Println(i)
      }
   }
   wg.Done()

}

func B(){

   for i:=0;i<10;i++{
      <-CA
      if i%2 == 1{
         fmt.Println(i)
      }

   }
   wg.Done()

}

方法三 不使用channel

本次协程不打印时,让代码自旋;等待另外的协程递增而引起本协程再次进入业务代码。

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
func main(){
	wg.Add(2)
	i:=0
	go func(){
	defer wg.Done()
	for {
		if i>100{
			break
		}
		if i%2 == 0{

			fmt.Printf("a: %d\n",i)
			i++
		}
	}
	}()

	go func(){
		defer wg.Done()
		for {
			if i>100{
				break
			}
			if i%2 == 1{
				fmt.Printf("b: %d\n",i)
				i++
			}
		}
	}()
	wg.Wait()
}