要求:
- 并发两协程交替打印数字和字母。
- 一个协程打印数字,一个协程打印字母。
输出:
12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728
思路:
- 两个
channel
控制两个协程进行交替打印。 sync.WaitGroup
控制主协程等待子协程完成。
完整代码:
go
package main
import (
"fmt"
"sync"
)
func main() {
letter, number := make(chan bool), make(chan bool) // 两个 chan 用于交替执行两个子协程
wait := sync.WaitGroup{} // 设置计数器,用于控制主协程堵塞等待子协程执行
go func() {
i := 1
for {
select {
case <-number: // 堵塞,等待number有值后向下执行
fmt.Print(i) // 打印两个连续的数字
i++
fmt.Print(i)
i++
letter <- true // 赋值后,打印字母协程收到后继续执行
}
}
}()
wait.Add(1) // 计数器加1
go func() {
i := 'A'
for {
select {
case <-letter: // 堵塞,等待letter有值向下执行
if i >= 'Z' { // 子协程结束
wait.Done() // 计数器设置为0,退出主线程
return
}
fmt.Print(string(i)) // 打印两个连续的字母
i++
fmt.Print(string(i))
i++
number <- true // 赋值后,打印数字协程收到后继续执行
}
}
}()
fmt.Println("程序先执行此句输出。")
number <- true // 赋值后,打印数字协程收到后继续执行
wait.Wait() // 堵塞主协程,直到计数器为0
fmt.Println("\n程序最后执行此句输出。")
}