编程go协程交叉顺序打印数组

参考解析

题目来源:字节

答案:

使用channel实现交叉打印0-100中的奇偶数。代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var (
  7. toOdd = make(chan struct{})
  8. toEven = make(chan struct{})
  9. wg = sync.WaitGroup{}
  10. )
  11. func main() {
  12. wg.Add(2)
  13. go printOdd()
  14. go printEven()
  15. wg.Wait()
  16. fmt.Println("-----done-----")
  17. }
  18. func printOdd() {
  19. defer wg.Done()
  20. for i := 1; i <= 100; i += 2 {
  21. if i != 1 {
  22. <-toOdd
  23. }
  24. fmt.Println(i)
  25. toEven <- struct{}{}
  26. }
  27. }
  28. func printEven() {
  29. defer wg.Done()
  30. for i := 2; i <= 100; i += 2 {
  31. <-toEven
  32. fmt.Println(i)
  33. if i != 100 {
  34. toOdd <- struct{}{}
  35. }
  36. }
  37. }