• 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都可实现轮流控制
  • 相关阅读:
    PLC衔接新方式UcAsp.Opc
    dev barmanager 中的 add按钮出不来,无法创建菜单的问题解决
    一个或多个页边距被设置到也可打印的页面范围之外,处理方式
    bar设置全背景色
    PHP计算两个字符的相似程度similar_text
    PHP中双冒号::的用法
    百度站内搜索应该注意哪些方面?
    快给你的网站添加微信公众号吧!
    实例讲解网站前台界面开发流程
    百度富文本编辑器UEditor安装配置全过程
  • 原文地址:https://www.cnblogs.com/yinbiao/p/16141915.html
Copyright © 2020-2023  润新知