我的学习仓库,欢迎交流学习:github.com/Benny66/goS…
每个函数起一个 goroutine,轮流打印 cat、dog、fish 100 次
package interview
import (
"fmt"
"sync"
"sync/atomic"
"testing"
)
var i int64 = 1 //当前打印次数
var j int64 = 100 //打印次数
var mySync sync.WaitGroup
func TestChannel(t *testing.T) {
mySync.Add(1)
var dogChan = make(chan string, 0)
var catChan = make(chan string, 0)
var fishChan = make(chan string, 0)
go dogChanF(dogChan, catChan)
go catChanF(catChan, fishChan)
go fishChanF(fishChan, dogChan)
dogChan <- "dog"
mySync.Wait()
}
func dogChanF(dogChan, catChan chan string) {
for {
if dog, ok := <-dogChan; ok {
fmt.Println(dog)
catChan <- "cat"
} else {
return
}
}
}
func catChanF(catChan, fishChan chan string) {
for {
if cat, ok := <-catChan; ok {
fmt.Println(cat)
fishChan <- "fish"
} else {
return
}
}
}
func fishChanF(fishChan, dogChan chan string) {
for {
if fish, ok := <-fishChan; ok {
fmt.Println(fish)
atomic.AddInt64(&i, 1)
if i > j {
mySync.Done()
}
dogChan <- "dog"
} else {
return
}
}
}