当前位置:   article > 正文

Golang 面试题(3) 两个协程轮流打印字母和数字

golang交替打印数字与字符

Golang面试编程题3

实现两个协程轮流输出A 1 B 2 C 3 .... Z 26

方案1:有缓冲的chan

  1. func ChannelFunc() {
  2. // 思想:两个g,一个输出数字,一个输出字母,重点是如何控制两个g的打印顺序,让其可以轮流打印
  3. // 分别使用两个缓存为1的chan,来控制两个g的打印顺序
  4. strChan := make(chan int, 1)
  5. numChan := make(chan int, 1)
  6. strChan <- 0 // 先往字符chan中塞入,此时strChan再塞入会堵塞
  7. // 负责打印字母
  8. go func() {
  9. for i := 65; i <= 90; i++ {
  10. <-strChan // strChan取出,因为之前先塞入了,所以此处不会堵塞,会直接打印字符A..Z
  11. fmt.Printf("%v ", string(rune(i))) // 打印字母
  12. numChan <- i // numChan 塞入,塞入后,另一个g的numChan取出操作才能进行
  13. }
  14. return
  15. }()
  16. // 负责打印数字
  17. go func() {
  18. for i := 1; i <= 26; i++ {
  19. <-numChan // 一直阻塞,直到字母被打印,这样每次数字都是在字母后面被打印的
  20. fmt.Printf("%v ", i) /// 打印数字
  21. strChan <- i // strChan塞入,此处塞入后,上面协程的strChan取出操作才能进行,才会打印字母,这样保证了打印完数字后,紧接着打印字母
  22. }
  23. return
  24. }()
  25. time.Sleep(1 * time.Second)
  26. fmt.Println()
  27. // A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S 19 T 20 U 21 V 22 W 23 X 24 Y 25 Z 26
  28. }

方案2:无缓冲的chan

  1. func ChannelFunc() {
  2. strChan := make(chan int)
  3. numChan:= make(chan int)
  4. // 打印字母
  5. go func() {
  6. for i := 65; i <= 90; i++ {
  7. // 保证字母先被打印
  8. fmt.Printf("%v ", string(rune(i)))
  9. strChan <- i // strChan塞入,通知数字可以被打印了
  10. <-numChan // numChan一直被阻塞,直到被g2通知可以打印字母了
  11. }
  12. return
  13. }()
  14. // 打印数字
  15. go func() {
  16. for i := 1; i <= 26; i++ {
  17. <-strChan // strChan拉取,一直被阻塞,直到被strChan被塞入,即被g1通知数字可以打印了之后才解除阻塞
  18. fmt.Printf("%v ", i)
  19. numChan <- i // numChan塞入,通知g1可以打印字母
  20. }
  21. return
  22. }()
  23. time.Sleep(1 * time.Second)
  24. fmt.Println()
  25. }

总结:

  • 一个协程负责打印数字,一个协程负责打印字母,分开进行,我们只需要控制其轮流打印即可
  • 采用有无缓冲的Chan都可实现轮流控制
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43006
推荐阅读
相关标签
  

闽ICP备14008679号