3个函数分别打印cat、dog、fish,要求每个函数都要起一个goroutine,按照cat、dog、fish顺序打印在屏幕上10次
这里的代码有个问题:通道的创建调用的是底层的makechan()函数,返回值为一个指针类型。所以可以直接传递channel本身,不需要像我这里对通道类型取指针。
//3个函数分别打印cat、dog、fish,要求每个函数都要起一个goroutine,按照cat、dog、fish顺序打印在屏幕上10次
func main() {
var wg sync.WaitGroup
dogCh := make(chan struct{}, 1)
defer close(dogCh)
catCh := make(chan struct{}, 1)
defer close(catCh)
fishCh := make(chan struct{}, 1)
defer close(fishCh)
wg.Add(3)
go catPrint(&wg, &catCh, &dogCh)
go dogPrint(&wg, &dogCh, &fishCh)
go fishPrint(&wg, &fishCh, &catCh)
catCh <- struct{}{}
wg.Wait()
}
func catPrint(wg *sync.WaitGroup, catCh *chan struct{}, dogCh *chan struct{}) {
count := 0
for {
if count >= 10 {
wg.Done()
fmt.Println("cat quit")
return
}
<-*catCh
fmt.Println("cat", count)
count++
*dogCh <- struct{}{}
}
}
func dogPrint(wg *sync.WaitGroup, dogCh *chan struct{}, fishCh *chan struct{}) {
count := 0
for {
if count >= 10 {
wg.Done()
fmt.Println("dog quit")
return
}
<-*dogCh
fmt.Println("dog")
count++
*fishCh <- struct{}{}
}
}
func fishPrint(wg *sync.WaitGroup, dogCh *chan struct{}, catCh *chan struct{}) {
count := 0
for {
if count >= 10 {
wg.Done()
fmt.Println("fish quit")
return
}
<-*dogCh
fmt.Println("fish")
count++
*catCh <- struct{}{}
}
}