go语言进阶实战学习(逐行注释)(1):两协程并发交替打印数字和字母

要求:

  • 并发两协程交替打印数字和字母。
  • 一个协程打印数字,一个协程打印字母。

输出:

  • 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程序最后执行此句输出。")
}
相关推荐
索荣荣7 分钟前
JavaToken实战指南:从原理到应用
开发语言·python
zho_uzhou13 分钟前
c++ imgui implot绘图使用示例 visual studio
开发语言·c++·visual studio
dyyx11114 分钟前
C++中的过滤器模式
开发语言·c++·算法
星夜泊客29 分钟前
C# 基础:为什么类可以在静态方法中创建自己的实例?
开发语言·经验分享·笔记·unity·c#·游戏引擎
CappuccinoRose31 分钟前
React框架学习文档(七)
开发语言·前端·javascript·react.js·前端框架·reactjs·react router
Daydream.V34 分钟前
网页学习——HTML
学习
消失的旧时光-194341 分钟前
从拷贝到移动:C++ 移动构造与移动赋值是怎么被逼出来的?(附完整示例)
开发语言·c++
古译汉书42 分钟前
部分.exe文件打开但是一直显示界面,点击任务栏持续无反应
开发语言·单片机·嵌入式硬件
张永清-老清44 分钟前
每周读书与学习->JMeter性能测试脚本编写实战(四)-利用JMeter对MySQL数据库查询进行性能测试
学习·jmeter·性能调优·jmeter性能测试·性能分析·每周读书与学习
2301_817497331 小时前
C++中的装饰器模式高级应用
开发语言·c++·算法