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++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景