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程序最后执行此句输出。")
}
相关推荐
2601_966949653 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨5 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪6 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风6 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
学长毕设6 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
2601_962885728 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里9 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
天外飞雨道沧桑10 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl10 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言