Go语言使用两个协程按顺序交替打印 1 - n ,一个协程打印偶数,一个协程打印奇数
方法一:使用两个缓冲为1的channel + sync.WaitGroup
为什么需要使用有缓冲的channel?
因为如果不使用带缓冲的channel会导致死锁问题,死锁的原因是当其中一个协程打印结束后,即执行完以后,另外一个协程就不能在向channel写数据了,导致死锁。
例如:
n = 3时,
- 打印奇数的协程先打印1
- 打印偶数的协程打印2,然后该协程执行完了
- 打印奇数的协程打印3,然后再向channel写数据时
报错:fatal error: all goroutines are asleep - deadlock!
(对于无缓冲的通道,能够向通道写入数据的前提是必须有另外一个协程在读取通道)
func printNumber(n int) {
c1 := make(chan bool, 1)
c2 := make(chan bool, 1)
wg := sync.WaitGroup{
}
wg.Add(2)
go func(n int) {
defer wg.Done()
for i := 2; i <= n; i += 2 {
<-c1
fmt.Println(i)
c2 <- true
}
}(n)
go func(n int) {
defer wg.Done()
for i := 1; i <= n; i += 2 {
<-c2
fmt.