💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**问题描述** 使用两个`goroutine`交替打印序列,一个`goroutine`打印数字, 另外一个`goroutine`打印字母, 最终效果如下: ~~~shell 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 ~~~ **解题思路** 问题很简单,使用 channel 来控制打印的进度。使用两个 channel ,来分别控制数字和字母的打印序列, 数字打印完成后通过 channel 通知字母打印, 字母打印完成后通知数字打印,然后周而复始的工作。 **源码参考** ~~~ letter,number := make(chan bool),make(chan bool) wait := sync.WaitGroup{} go func() { i := 1 for { select { case <-number: fmt.Print(i) i++ fmt.Print(i) i++ letter <- true break default: break } } }() wait.Add(1) go func(wait *sync.WaitGroup) { str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" i := 0 for{ select { case <-letter: if i >= strings.Count(str,"")-1 { wait.Done() return } fmt.Print(str[i:i+1]) i++ if i >= strings.Count(str,"") { i = 0 } fmt.Print(str[i:i+1]) i++ number <- true break default: break } } }(&wait) number<-true wait.Wait() ~~~ **源码解析** 这里用到了两个`channel`负责通知,letter 负责通知打印字母的 goroutine 来打印字母,number 用来通知打印数字的 goroutine 打印数字。 wait 用来等待字母打印完成后退出循环。