golang交替輸出字符串

朋友問了一道使用通道來實現“多線程”通訊的golang題,我看了下,還比較簡單。
但由於這個對理解golang之間利用通道通訊有一定的幫助,所以寫下如下代碼,發出來給大家看看。

思路簡要:
最開始需要用一個帶緩存的通道來觸發開始操作,否則會引起死鎖。然後用兩個通道不斷的交替進行接收與發送

package main

/**
用三個線程,交替輸出abc,abc,abc...
*/

import (
	"fmt"
	"time"
)

func printc(c1 chan bool, c2 chan bool, s string) {
	// 這個判斷不能少,否則會亂套,只有在當前接收有效時,才向下一個通道發送數據
	if ok := <-c1; ok {
		fmt.Println(s)
		c2 <- true
	}
}
func main() {
    // c1 使用帶緩存的通道
	c1 := make(chan bool, 1)
	c2 := make(chan bool)
	c3 := make(chan bool)
	defer func() {
		close(c1)
		close(c2)
		close(c3)
	}()
	// 開始觸發通道 c1
	c1 <- true
	// 爲了表示,這裏先使用死循環,如果需要正常退出,可以單獨退出處理
	for {
		go printc(c1, c2, "a")
		go printc(c2, c3, "b")
		go printc(c3, c1, "c")
		time.Sleep(time.Second)
	}
}

在通道的接收發送中,我們需要理解一點通道的底層實現原理,那就是接收操作一定會在發送操作完成前完成,所以不要擔心不會打印。通用一點,就是第K個接收操作一定會在第K+C個發送操作完成之前完成。C是通道緩衝大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章