1. 程式人生 > >【高階資料型別】- 6.通道的更多種類

【高階資料型別】- 6.通道的更多種類

Go語言-通道的更多種類

    我們在上一節所說的通道,實際上只是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設計的範疇。因此我們在這裡僅