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程序最后执行此句输出。")
}
相关推荐
我是苏苏1 小时前
C#基础:Winform桌面开发中窗体之间的数据传递
开发语言·c#
斐波娜娜2 小时前
Maven详解
java·开发语言·maven
小码氓2 小时前
Java填充Word模板
java·开发语言·spring·word
暮鹤筠2 小时前
[C语言初阶]操作符
c语言·开发语言
Boilermaker19924 小时前
【Java EE】Mybatis-Plus
java·开发语言·java-ee
aramae4 小时前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
Tony小周4 小时前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
lixzest5 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
fen_fen5 小时前
学习笔记(32):matplotlib绘制简单图表-数据分布图
笔记·学习·matplotlib
沉默媛5 小时前
如何安装python以及jupyter notebook
开发语言·python·jupyter