GO語言學習——(1) channel入門

(一)簡介   

Go語言所提倡的一句話是:應該以通信作爲手段來共享內存,這句話最直接的體現就是channel,它也是Go語言預定義的數據類型之一。

   channel提供了一種機制,它既可以同步兩個併發執行的函數,又可以額昂兩個函數通過相互傳遞特定類型的值來通信。

(二)channel的基本概念

   在go語言中,chnnel既指通道類型,也指代可以傳遞某種類型的值的通道。通道即某一個通道類型的值,是該類型的一個實例。

  1、類型表示法

通道類型也屬於引用類型,

chan T

關鍵字chan是代表通道類型的關鍵字,而T則表示了該通道類型的元素類型(用於限制傳入通道的值的類型)

var intChan chan int //初始化後,變量intChan就可以用來傳遞int類型的元素值了

下面介紹通道的發送和接收操作

chan<- T//用於發送值的通道類型的泛化表示

<-chanT// 用於接收

 2、值表示法

   因爲通道類型是一個引用類型,所以一個通道類型的變量在被初始化前,其值一定是nil,這也是此類型的零值。

3、操作的特性

    通道是在多個goroutine之間傳遞數據和同步的重要手段,而對通道的操作本身也是同步的。在同一時刻,僅有一個goroutine能向一個通道發送元素值,同時也僅有一個goroutine能從他那裏接受元素值。在通道中,各個元素值都是嚴格按照發送到次的先後順序排列的,最早被髮送至通道的元素值會最先被接收。因此,通道相當於FIFO的隊列。此外,通道中的元素值都具有原子性,是不可被分割的。通道中的每一個元素值都只可能被某一個goroutine接收,已被接收的元素值會立刻從通道中刪除。

4、初始化通道

    make(chan int, 10)

    這個表達式初始化了一個通道類型的值,傳遞給make函數的第一個參數表明,此值的具體類型是元素類型爲int的通道類型,而第二個參數則指出該通道值在同一時刻最多可以緩衝10個元素值。

    你也可以在初始化通道時省略第二個參數值,像這樣:

    make(chan int)

    一個通道值的緩衝容量總是固定不變的,如果第二個參數值被省略,就表示被初始化的這個通道永遠無法緩衝任何元素值(即發送給它的元素值應該被立刻取走,否則發送方的foroutine就會被暫停或者說阻塞,知道有接收方接收這個元素值)

    增加兩個概念。

    緩衝通道:初始化時第二個參數大於0的通道

    非緩衝通道: 初始化時未給出第二個參數值或者給出爲0的通道

5、接受元素值

     接受操作符<-不但可以作爲通道類型聲明的一部分,也可以用於通道操作(發送活接受元素值)。舉個例子:

     strChan := make(chan string, 3)//這是一個雙向通道,該通道的元素類型爲string,容量爲3

     如果要從該通道中接收元素值,那就這樣:

     elem := <-strChan

     像這樣也可以:

     elem, ok := <-strChan

     兩種寫法唯一不同之處在於,如果在執行接收操作之前或過程當中該通道被關閉了,那麼第二種操作會立即結束,並且elem會被賦予該通道的元素類型的零值。變量ok會是一個布爾類型,當接收操作因通道關閉而結束時,該值會是false(代表操作失敗),否則會爲true,這樣我們就很容易判斷接收操作的具體情況了。換言之,要使用第一個做法,要是接收到一個零值,你也不確定是通道結束了,還是本身通道中的值就是零值。

  注意點: 試圖從一個未被初始化的通道值(即值爲nil的通道)那裏接收元素值,會造成當前goroutine的永久阻塞!

     GO語言學習——(2) channel實操之通道阻塞

 

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