用Go实现交替打印数字和字母

引言

在编程的世界里,Go语言以其简洁、高效、并发的特性而广受欢迎。今天,我们将通过一个有趣的小例子——交替打印数字和字母,来一窥Go语言并发编程的魅力。

问题背景

想象一下,我们需要打印一个序列,其中数字和字母交替出现,最终效果如下:

12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728

这听起来似乎很简单,但如何用Go语言实现这一过程,并且保证数字和字母交替打印呢?

解题思路

Go语言的并发模型基于goroutinechannel。在这个例子中,我们将创建两个goroutine:一个负责打印数字,另一个负责打印字母。我们将使用channel来同步这两个goroutine的执行,确保它们能够交替打印。

源码实现

下面是实现这一功能的Go语言代码:

package mainimport ("fmt""strings""sync"
)func main() {letter, number := make(chan bool), make(chan bool)var wait sync.WaitGroupgo func() {i := 1for {select {case <-number:fmt.Print(i)i++fmt.Print(i)i++letter <- truedefault:// 这里可以添加一些逻辑,比如超时重试等}}}()wait.Add(1)go func(wait *sync.WaitGroup) {str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"i := 0for {select {case <-letter:if i >= len(str)-1 {wait.Done()return}fmt.Print(string(str[i]))i++if i >= len(str) {i = 0}fmt.Print(string(str[i]))i++number <- truedefault:// 这里可以添加一些逻辑,比如超时重试等}}}(&wait)number <- truewait.Wait()
}

代码解析

  1. 我们定义了两个channelletternumber,分别用于控制字母和数字的打印。
  2. 使用sync.WaitGroup来等待所有goroutine完成。
  3. 第一个goroutine负责打印数字,每打印两个数字后,通过letter通知另一个goroutine打印字母。
  4. 第二个goroutine负责打印字母,每打印两个字母后,通过number通知第一个goroutine打印数字。
  5. 通过select语句,我们可以在channel操作和默认情况下进行选择,增加了代码的灵活性。

总结

通过这个简单的例子,我们不仅学会了如何在Go语言中使用goroutinechannel来实现并发控制,还体会到了Go语言在并发编程方面的强大能力。Go语言的并发模型简洁而强大,非常适合处理需要高并发的应用程序。希望这个例子能够启发你在实际开发中更好地利用Go语言的并发特性。

结尾

并发编程是现代软件开发中不可或缺的一部分。Go语言以其独特的并发模型,为开发者提供了一种简单而高效的方式来构建并发应用程序。如果你对Go语言的并发编程感兴趣,不妨从这个小例子开始,逐步探索Go语言的并发之美。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose 映射端口失败! docker端口映射失败 ,docker映射只能使用老端口,映射无法使用

1. 现象 使用docker-compose 启动项目&#xff0c;发现映射端口出现问题&#xff0c;不能映射端口&#xff01; 如图&#xff1a; 使用原来端口是可以使用的 2. 问题原因&#xff1a; 使用了docker-mode 为host模式&#xff0c;所以不能换端口&#xff0c;只能写为"8086:…

SpringBoot——基于Spring Task实现定时任务

目录 定时任务 项目总结 新建一个SpringBoot项目 pom.xml无需引入依赖 SpringTaskDemo SpringbootSpringtaskApplication启动类 定时任务 在日常的项目开发中&#xff0c;往往会涉及一些需要做到定时执行的代码&#xff0c;例如自动将超过24小时的未付款的订单改为取消状…

【调试笔记-20240522-Windows-WSL 修改已安装发行版名称】

调试笔记-系列文章目录 调试笔记-20240522-Windows-WSL 修改已安装发行版名称 文章目录 调试笔记-系列文章目录调试笔记-20240522-Windows-WSL 修改已安装发行版名称 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤方法一&#xff1a;修…

数字化校园的特征

"数字化校园"是校园信息化进入高级阶段的表现形式&#xff0c;信息技术与教育教育的交融应该更深化。因而&#xff0c;数字化校园应该具以下特征&#xff1a; 1.互联网络高速发展 网络是信息时代的根基&#xff0c;没有网络就无法完成教育信息化的绝大部分作业。数字…

Go Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8二、邮箱服务配置,以QQ邮箱为例 三、示例代码 package mainimport ("context""fmt"redis "github.com/go-redis/redis/v8""gopkg.in/gomail.v2""gopkg.in/ini.v1"&quo…

总结 HTTP 协议的基本格式

一、HTTP 是什么 HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议 . HTTP 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 协议目前有三个大版本: HTTP / 1 和 HTTP / 2 都是基于TCP 传输控制协议传输数据。最新版本的…

Java基础语法---Stringjoiner

Stringjoiner 使用需要加入 import java.util.StringJoiner 构造方法: StringJoiner(CharSequence delimiter) 创建一个 StringJoiner 实例&#xff0c;使用指定的分隔符&#xff0c;前缀和后缀默认为空字符串。 StringJoiner(CharSequence delimiter, CharSequence prefix, C…

60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

UE的Environment Query System&#xff08;EQS&#xff09;是环境查询系统&#xff0c;它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据&#xff0c;利用生成器&#xff08;Generator&#xff09;针对用户的测试&#xff08;T…

跳台阶扩展问题

题目链接 f(1) 1f(2) 1 1 2f(3) 1 2 1 4f(4) 1 2 4 1 8 所以 f(n) 2 n − 1 ^{n-1} n−1 import java.util.Scanner;public class Solution {public int jumpFloorII(int target) {return 1 << (target - 1);} }

基于SpringBoot的旅游管理系统

基于SpringBoot的旅游管理系统 旅游管理系统开发技术功能模块代码结构数据库设计运行截图源码获取 旅游管理系统 开发技术 技术&#xff1a;SpringBoot、MyBatis-Plus、MySQL、Beetl、Layui。 框架&#xff1a;基于开源框架Snowy-Layui开发。 工具&#xff1a;IDEA、Navicat等…

ESP32 - Micropython ESP-IDF 双线教程 WIFI (1)

ESP32 - Micropython ESP-IDF 双线教程 WIFI ESP32-WIFI介绍1. 工作模式2. 主要功能3. 编程接口总结 ESP32 - Micropython WIFIESP32-MicroPython Wi-Fi 功能示例代码代码解释注意事项 ESP32中的Wi-Fi功能是其核心特性之一&#xff0c;它基于IEEE 802.11标准&#xff0c;提供了…

Python 读取.shp文件并生成图幅编号

代码适用于需要处理和分析地理空间数据的场景&#xff0c;如城市规划、环境监测或自然资源管理&#xff0c;其中它可以帮助用户读取特定区域的Shapefile文件&#xff0c;确定其地理边界&#xff0c;并基于这些边界计算出按照经纬度5度间隔的图幅编号&#xff0c;进而用于地图制…

django中,无法跳转到请求的html页面?

出现错误&#xff1a; You’re seeing this error because you have DEBUG True in your Django settings file. Change that to False, and Django will display a standard 404 page. 在urls中&#xff0c;注释了系统的默认配置&#xff0c;这时就需要在setting配置文件中&…

HTML <from>表单

定义&#xff1a;<form>元素定义了一个表单&#xff0c;用户可以在表单中输入数据&#xff0c;这些数据可以被提交到服务器。 属性&#xff1a; action&#xff1a;指定表单提交时的目标URL&#xff08;服务器端脚本的地址&#xff09;。 method&#xff1a;定义提交表…

AI爆文写作:使用AI来帮你拆分吧,过程丝滑,效率翻倍:拆选题、拆标题、拆结构、拆逻辑、拆段落、收集素材吧!

文章目录 一、为什么要拆文?二、拆分拆什么?三、怎么拆?**1、拆选题和标题:理解作者意图****2、拆结构:学会谋篇布局****3、拆逻辑:洞察思路观点****4、拆段落:掌握起承转合****5、收集语料,丰富素材库**四、拆分提示词一、为什么要拆文? 新进入某个领域,模仿“过来…

使用Node.js搭建服务器

使用Node.js搭建服务器 1.安装Node.js和npm 安装教程自行搜索&#xff08;好多&#xff09;&#xff0c;建议Node.js直接安装在C盘 注意镜像的设置&#xff1a;npm install -g cnpm --registryhttps://registry.npm.taobao.org 注意版本检查&#xff1a; //以下是我使用的版…

Android Studio 版本升级后 Gradle project sync failed(Android V 应用升级)

问题及解决方案 更新到蜥蜴 Android Studio Iguana 后&#xff0c;出现Gradle project sync failed的问题&#xff08;IDE更新版本的常态了&#xff09;。 背景&#xff1a;对应用进行Android V版本升级&#xff08;SDK35&#xff0c;gradle插件版本要 8.4.0&#xff09; 1、…

Java实现对PDF、纵向、横向页面添加自定义水印功能

Java实现对PDF、纵向、横向页面添加自定义水印 效果图 -- 纵向 页面PDF使用到JAR Maven依赖版本效果图 -- 横向页面PDF 效果图 – 纵向 页面PDF 代码如下&#xff1a; 使用到JAR Maven依赖版本 <dependency><groupId>org.apache.pdfbox</groupId><artifa…

redis 主从复制薪火相传 哨兵sentinel配置以及底层原理

薪火相传 我们知道redis的主从复制还有一个常见的架构 ---薪火相传 使用这种结构可以有效减轻master节点的复制数据同步压力 注意这里的6380节点仍然是slave节点 可以理解为一个中间节点,仍然是不可以写只可以读取的 我们只需要使用 slaveof ip port 这里可能访问节点的时候出…

yolov系列

学习一个深度学习网络&#xff0c;就看三点&#xff0c;1. 网络架构 2.输入输出 3.损失函数 yolov1 2015年诞生的YOLOv1创造性地使用端到端结构完成了物体检测任务&#xff0c;把检测问题转换成了回归问题&#xff0c;直接预测物体的类别和位置。 每个grid有30维&#xff0c;…