问:

要求创建三个函数分别打印,“dog”,“cat”,“fish”,
要求每个函数起一个goroutine,请按照dog,cat,fish的顺序,打印四次,输出到控制台。

代码:

package main

import (
    "fmt"
)

func main() {
    dogCh := make(chan bool, 1) //给一个1的缓存区是为了暂存fish函数最后发生的一个true
    catCh := make(chan bool)
    fishCh := make(chan bool)
    exitch := make(chan bool)
    go func() {
        for i := 0; i < 4; i++ {
            if <-dogCh {
                fmt.Println("dog")
                catCh <- true
            }
        }
    }()

    go func() {
        for i := 0; i < 4; i++ {
            if <-catCh {
                fmt.Println("cat")
                fishCh <- true
            }
        }
    }()
    go func() {
        defer close(exitch) //在协程最后close exit给出信号协程执行完毕,避免主go结束协程未跑完造成死锁
        for i := 0; i < 4; i++ {
            if <-fishCh {
                fmt.Println("fish")
                dogCh <- true
            }
        }
    }()
    dogCh <- true
    <-exitch
}