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) /// 打印数字