util_more_test.go 840 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package util
  2. import (
  3. "fmt"
  4. "sync"
  5. "testing"
  6. )
  7. func cat(catCh, dogCh chan struct{}, wg *sync.WaitGroup) {
  8. defer wg.Done()
  9. for i := 0; i < 100; i++ {
  10. <-catCh
  11. fmt.Println("cat", i)
  12. dogCh <- struct{}{}
  13. }
  14. }
  15. func dog(dogCh, fishCh chan struct{}, wg *sync.WaitGroup) {
  16. defer wg.Done()
  17. for i := 0; i < 100; i++ {
  18. <-dogCh
  19. fmt.Println("dog", i)
  20. fishCh <- struct{}{}
  21. }
  22. }
  23. func fish(fishCh, catCh chan struct{}, wg *sync.WaitGroup) {
  24. defer wg.Done()
  25. for i := 0; i < 100; i++ {
  26. <-fishCh
  27. fmt.Println("fish", i)
  28. catCh <- struct{}{}
  29. }
  30. }
  31. func Test001(T *testing.T) {
  32. catCh := make(chan struct{}, 1)
  33. dogCh := make(chan struct{}, 1)
  34. fishCh := make(chan struct{}, 1)
  35. var wg sync.WaitGroup
  36. wg.Add(3)
  37. go cat(catCh, dogCh, &wg)
  38. go dog(dogCh, fishCh, &wg)
  39. go fish(fishCh, catCh, &wg)
  40. catCh <- struct{}{}
  41. wg.Wait()
  42. }