Golang 面试题(3) 两个协程轮流打印字母和数字
Golang面试编程题3
实现两个协程轮流输出A 1 B 2 C 3 .... Z 26
方案1:有缓冲的chan
func ChannelFunc() {
// 思想:两个g,一个输出数字,一个输出字母,重点是如何控制两个g的打印顺序,让其可以轮流打印
// 分别使用两个缓存为1的chan,来控制两个g的打印顺序
strChan := make(chan int, 1)
numChan := make(chan int, 1)
strChan <- 0 // 先往字符chan中塞入,此时strChan再塞入会堵塞
// 负责打印字母
go func() {
for i := 65; i <= 90; i++ {
<-strChan // strChan取出,因为之前先塞入了,所以此处不会堵塞,会直接打印字符A..Z
fmt.Printf("%v ", string(rune(i))) // 打印字母
numChan <- i // numChan 塞入,塞入后,另一个g的numChan取出操作才能进行
}
return
}()
// 负责打印数字
go func() {
for i := 1; i <= 26; i++ {
<-numChan // 一直阻塞,直到字母被打印,这样每次数字都是在字母后面被打印的
fmt.Printf("%v ", i) /// 打印数字
strChan <- i // strChan塞入,此处塞入后,上面协程的strChan取出操作才能进行,才会打印字母,这样保证了打印完数字后,紧接着打印字母
}
return
}()
time.Sleep(1 * time.Second)
fmt.Println()
// A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S 19 T 20 U 21 V 22 W 23 X 24 Y 25 Z 26
}
方案2:无缓冲的chan
func ChannelFunc() {
strChan := make(chan int)
numChan:= make(chan int)
// 打印字母
go func() {
for i := 65; i <= 90; i++ {
// 保证字母先被打印
fmt.Printf("%v ", string(rune(i)))
strChan <- i // strChan塞入,通知数字可以被打印了
<-numChan // numChan一直被阻塞,直到被g2通知可以打印字母了
}
return
}()
// 打印数字
go func() {
for i := 1; i <= 26; i++ {
<-strChan // strChan拉取,一直被阻塞,直到被strChan被塞入,即被g1通知数字可以打印了之后才解除阻塞
fmt.Printf("%v ", i)
numChan <- i // numChan塞入,通知g1可以打印字母
}
return
}()
time.Sleep(1 * time.Second)
fmt.Println()
}
总结:
- 一个协程负责打印数字,一个协程负责打印字母,分开进行,我们只需要控制其轮流打印即可
- 采用有无缓冲的Chan都可实现轮流控制
心之所向,素履以往
分类:
Golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2019-04-13 八大排序算法思想介绍