go语言实现两个goroutine交替执行打印数字和字母|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里的元素,继续运行,打印两个数字
<-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
}
方法二 【go语言实现两个goroutine交替执行打印数字和字母|go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF...】此方法是通过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
}
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 孩子不是实现父母欲望的工具——林哈夫
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- opencv|opencv C++模板匹配的简单实现
- C语言浮点函数中的modf和fmod详解
- Node.js中readline模块实现终端输入