Go開發工程師
未來3-5年企業高性能項目不可替代的語言,從基礎到項目實戰再到重構,真正從入門到精通
我們在上一節所說的通道,實際上只是Go語言中的通道的一種。它被稱為帶緩沖的通道,或簡稱為緩沖通道。
通道有帶緩沖和非緩沖之分。我們已經說過,緩沖通道中可以緩存N個數據。我們在初始化一個通道值的時候必須指定這個N。相對的,非緩沖通道不會緩存任何數據。發送方在向通道值發送數據的時候會立即被阻塞,直到有某一個接收方已從該通道值中接收了這條數據。非緩沖的通道值的初始化方法如下:
make(chan int, 0)
注意,在這里,給予make
函數的第二個參數值是0
。
除了上述分類方法,我們還可以以數據在通道中的傳輸方向為依據來劃分通道。默認情況下,通道都是雙向的,即雙向通道。如果數據只能在通道中單向傳輸,那么該通道就被稱作單向通道。我們在初始化一個通道值的時候不能指定它為單向。但是,在編寫類型聲明的時候,我們卻是可以這樣做的。例如:
type Receiver <-chan int
類型Receiver
代表了一個只可從中接收數據的單向通道類型。這樣的通道也被稱為接收通道。在關鍵字chan
左邊的接收操作符<-
形象地表示出了數據的流向。相對應的,如果我們想聲明一個發送通道類型,那么應該這樣:
type Sender chan<- int
這次<-
被放在了chan
的右邊,并且“箭頭”直指“通道”。想必不用多說你也能明白了。我們可以把一個雙向通道值賦予上述類型的變量,就像這樣:
var myChannel = make(chan int, 3) var sender Sender = myChannel var receiver Receiver = myChannel
但是,反之則是不行的。像下面這樣的代碼是通不過編譯的:
var myChannel1 chan int = sender
單向通道的主要作用是約束程序對通道值的使用方式。比如,我們調用一個函數時給予它一個發送通道作為參數,以此來約束它只能向該通道發送數據。又比如,一個函數將一個接收通道作為結果返回,以此來約束調用該函數的代碼只能從這個通道中接收數據。這屬于API設計的范疇。因此我們在這里僅了解一下即可。
請在命令源碼文件index.go的第 13 行的內層圓括號中填入一個正整數,使程序打印到標準輸出上的內容為:
Received! 6 Sent!
在第13行,應該填入0
。請回顧“知識要點”中加粗的那一句話。請填入大于零的整數、再次運行程序,并體會其中的玄機。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報