【高級數據類型】- 6.通道的更多種類

Go語言-通道的更多種類

    咱們在上一節所說的通道,實際上只是Go語言中的通道的一種。它被稱爲帶緩衝的通道,或簡稱爲緩衝通道。
  
    通道有帶緩衝和非緩衝之分。咱們已經說過,緩衝通道中能夠緩存N個數據。咱們在初始化一個通道值的時候必須指定這個N。相對的,非緩衝通道不會緩存任何數據。發送方在向通道值發送數據的時候會當即被阻塞,直到有某一個接收方已從該通道值中接收了這條數據。非緩衝的通道值的初始化方法以下:緩存

make(chan int, 0)

    注意,在這裏,給予make函數的第二個參數值是0
  
    除了上述分類方法,咱們還能夠以數據在通道中的傳輸方向爲依據來劃分通道。默認狀況下,通道都是雙向的,即雙向通道。若是數據只能在通道中單向傳輸,那麼該通道就被稱做單向通道。咱們在初始化一個通道值的時候不能指定它爲單向。可是,在編寫類型聲明的時候,咱們倒是能夠這樣作的。例如:函數

type Receiver <-chan int

    類型Receiver表明了一個只可從中接收數據的單向通道類型。這樣的通道也被稱爲接收通道。在關鍵字chan左邊的接收操做符<-形象地表示出了數據的流向。相對應的,若是咱們想聲明一個發送通道類型,那麼應該這樣:spa

type Sender chan<- int

    此次<-被放在了chan的右邊,而且「箭頭」直指「通道」。想必不用多說你也能明白了。咱們能夠把一個雙向通道值賦予上述類型的變量,就像這樣:設計

var myChannel = make(chan int, 3)
var sender Sender = myChannel
var receiver Receiver = myChannel

    可是,反之則是不行的。像下面這樣的代碼是通不過編譯的:code

var myChannel1 chan int = sender

    單向通道的主要做用是約束程序對通道值的使用方式。好比,咱們調用一個函數時給予它一個發送通道做爲參數,以此來約束它只能向該通道發送數據。又好比,一個函數將一個接收通道做爲結果返回,以此來約束調用該函數的代碼只能從這個通道中接收數據。這屬於API設計的範疇。所以咱們在這裏僅瞭解一下便可。編譯

相關文章
相關標籤/搜索