使用两个goroutine交替打印数字和字母

  1. 使用channel ```go package main

import “fmt”

var chan1 = make(chan bool, 1) var chan2 = make(chan bool) var index = make(chan bool, 1)

func func1() { for i := 1; i < 26; i += 2 { // 2, 取走chan1里的元素,继续运行,打印两个数字 <-chan1 fmt.Print(i) fmt.Print(i + 1) // 3, 给chan2 放入一个元素,等待取走元素 chan2 <- true } }

func func2() { for i := ‘A’; i <= ‘Z’; i += 2 { // 4, chan2 取出元素,执行打印两个字符 , <-chan2 fmt.Print(string(i)) fmt.Print(string(i + 1)) // 5, chan1 接收一个元素,进入阻塞状态,等待取走元素,进入第2步,2345步一直循环直到打印完 chan1 <- true } // 6, 结束循环,index通道接收一个元素,进入阻塞状态,等待取走 index <- true }

func main() { // 1, chan1 里放一个值,进入阻塞状态,等待取走元素 chan1 <- true go func1() go func2() // 7, index通道取走元素,继续往下执行 <-index // 结果: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ }

  1. 2. 使用sync.WaitGroup
  2. ```go
  3. package main
  4. import (
  5. "fmt"
  6. "sync"
  7. )
  8. var num = make(chan int, 1)
  9. var char = make(chan int, 1)
  10. var wg sync.WaitGroup
  11. func PrintNums() {
  12. defer wg.Done()
  13. for i := 0; i <= 12; i++ {
  14. // 使用双层循环实现一次性打印两个数字
  15. for j := 0; j < 2; j++ {
  16. fmt.Printf("%d", 2*i+j+1) // %d 格式化打印数字
  17. }
  18. // 1,执行一次内循环打印两个数字,num通道接收一个元素,阻塞,
  19. num <- 1
  20. // 4,再执行一次打印数字,char通道取走元素,继续执行
  21. <-char
  22. }
  23. }
  24. func PrintChars() {
  25. defer wg.Done()
  26. for i := 0; i <= 12; i++ {
  27. // 2,num通道取走元素,继续执行
  28. <-num
  29. // 使用双层循环实现一次性打印两个字符
  30. for j := 0; j < 2; j++ {
  31. fmt.Printf("%c", 'A'+(2*i+j)) // %c 格式化打印出字符(ACCIS码数字转字符)
  32. }
  33. // 3,执行一次内循环打印两个字符,char通道接收一个元素,阻塞
  34. char <- 1
  35. }
  36. }
  37. func main() {
  38. // 使用sync.WaitGroup实现主进程等待两个goroutine执行完再执行自己的程序
  39. wg.Add(2)
  40. go PrintNums()
  41. go PrintChars()
  42. wg.Wait()
  43. // 结果: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ
  44. }