go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF...

本文主要是介绍go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

go语言实现两个goroutine交替执行打印数字和字母,效果如下:
12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ…

这是一道某公司golang开发工程师的面试题, 考验了对goroutine和channl的使用, 更验证了go语言的CSP并发模型—要通过通信来共享内存.

CSP并发模型

CSP并发模型是在1970年左右提出的概念,属于比较新的概念,不同于传统的多线程通过共享内存来通信,CSP讲究的是“以通信的方式来共享内存”。
请记住下面这句话:
DO NOT COMMUNICATE BY SHARING MEMORY; INSTEAD, SHARE MEMORY BY COMMUNICATING.“不要以共享内存的方式来通信,相反,要通过通信来共享内存。”

在这里使用了两种方法实现, 代码执行顺序在注释里写的很清楚,方便初学者易懂, 当然还有其他方法 , 有建议或发现代码问题可以留言讨论 …

方法一

此方法中完全是由channl控制两个goroutine交替执行,并由channl控制了主进程的结束,没有使用sync.WaitGroup方法 ;可以看注释里的1~7步执行过程;

var chan1 = make(chan bool, 1)
var chan2 = make(chan bool)
var index = make(chan bool, 1)func func1() {for i := 1; i < 26;  i += 2 {// 2, 取走chan1里的元素,继续运行,打印两个数字<-chan1fmt.Print(i)fmt.Print(i + 1)// 3, 给chan2 放入一个元素,等待取走元素chan2 <- true}
}func func2() {for i := 'A'; i <= 'Z'; i += 2 {// 4, chan2 取出元素,执行打印两个字符 ,<-chan2fmt.Print(string(i))fmt.Print(string(i+1))// 5, chan1 接收一个元素,进入阻塞状态,等待取走元素,进入第2步,2345步一直循环直到打印完chan1 <- true}// 6, 结束循环,index通道接收一个元素,进入阻塞状态,等待取走index <- true
}func main()  {// 1, chan1 里放一个值,进入阻塞状态,等待取走元素chan1 <- truego func1()go func2()// 7, index通道取走元素,继续往下执行<-index
// 结果: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ
}
方法二

此方法是通过channl控制两个循环交替打印, 使用sync.WaitGroup方法来控制等待主进程,

var num =make(chan int,1)
var char =make(chan int,1)
var wg sync.WaitGroup
func PrintNums()  {defer wg.Done()for i  := 0; i  <= 12; i ++ {// 使用双层循环实现一次性打印两个数字for j := 0; j < 2; j++ {fmt.Printf("%d", 2*i+j+1)  // %d 格式化打印数字}// 1,执行一次内循环打印两个数字,num通道接收一个元素,阻塞,num <- 1// 4,再执行一次打印数字,char通道取走元素,继续执行<- char}
}func PrintChars()  {defer wg.Done()for i  := 0; i  <= 12; i++ {// 2,num通道取走元素,继续执行<-num// 使用双层循环实现一次性打印两个字符for j := 0; j < 2; j++ {fmt.Printf("%c", 'A'+(2*i+j)) // %c 格式化打印出字符(ACCIS码数字转字符)}// 3,执行一次内循环打印两个字符,char通道接收一个元素,阻塞char<-1}
}
func main()  {
// 使用sync.WaitGroup实现主进程等待两个goroutine执行完再执行自己的程序wg.Add(2)go PrintNums()go PrintChars()wg.Wait()
// 结果: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ
}

这篇关于go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759054

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1