package util import ( "fmt" "sync" "testing" ) func cat(catCh, dogCh chan struct{}, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < 100; i++ { <-catCh fmt.Println("cat", i) dogCh <- struct{}{} } } func dog(dogCh, fishCh chan struct{}, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < 100; i++ { <-dogCh fmt.Println("dog", i) fishCh <- struct{}{} } } func fish(fishCh, catCh chan struct{}, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < 100; i++ { <-fishCh fmt.Println("fish", i) catCh <- struct{}{} } } func Test001(T *testing.T) { catCh := make(chan struct{}, 1) dogCh := make(chan struct{}, 1) fishCh := make(chan struct{}, 1) var wg sync.WaitGroup wg.Add(3) go cat(catCh, dogCh, &wg) go dog(dogCh, fishCh, &wg) go fish(fishCh, catCh, &wg) catCh <- struct{}{} wg.Wait() }