博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF...
阅读量:4167 次
发布时间:2019-05-26

本文共 2266 字,大约阅读时间需要 7 分钟。

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里的元素,继续运行,打印两个数字 <-chan1 fmt.Print(i) fmt.Print(i + 1) // 3, 给chan2 放入一个元素,等待取走元素 chan2 <- true }}func func2() {
for i := 'A'; i <= 'Z'; i += 2 {
// 4, chan2 取出元素,执行打印两个字符 , <-chan2 fmt.Print(string(i)) fmt.Print(string(i+1)) // 5, chan1 接收一个元素,进入阻塞状态,等待取走元素,进入第2步,2345步一直循环直到打印完 chan1 <- true } // 6, 结束循环,index通道接收一个元素,进入阻塞状态,等待取走 index <- true}func main() {
// 1, chan1 里放一个值,进入阻塞状态,等待取走元素 chan1 <- true go 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.WaitGroupfunc 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}

转载地址:http://rjqxi.baihongyu.com/

你可能感兴趣的文章
嵌入式100题(044):为什么客户端最后还要等待2MSL?
查看>>
嵌入式100题(045):为什么建立连接是三次握手,关闭连接确是四次挥手呢?...
查看>>
嵌入式100题(028):static的用法(定义和用途)
查看>>
嵌入式100题(027):char和int之间的转换
查看>>
嵌入式100题(029):const常量和#define的区别(编译阶段、安全性、内存占用等)...
查看>>
嵌入式100题(030):volatile作用和用法
查看>>
嵌入式100题(033):TCP、UDP的优缺点
查看>>
嵌入式100题(035):TCP为什么是可靠连接
查看>>
嵌入式100题(034):TCP UDP适用场景
查看>>
嵌入式100题(70):一个程序从开始运行到结束的完整过程(四个过程)
查看>>
嵌入式100题(71):什么是堆,栈,内存泄漏和内存溢出?
查看>>
嵌入式100题(73):死锁的原因、条件 创建一个死锁,以及如何预防
查看>>
嵌入式100题(74):硬链接与软链接的区别
查看>>
嵌入式100题(75):计算机中,32bit与64bit有什么区别
查看>>
嵌入式100题(60):系统调用的作用
查看>>
C语言基本概念归纳
查看>>
初识单片机
查看>>
在单片机上点亮LED
查看>>
初学定时器
查看>>
数码管
查看>>