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 分钟前
go orm GORM
开发语言·后端·golang
丁卯40423 分钟前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
李白同学2 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
leegong231112 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
Moonnnn.3 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
黑子哥呢?3 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农3 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿3 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
南宫生3 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
技术小齐4 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习