C語言中文網 目錄
首頁 > Go語言教程 > Go語言并發 閱讀:2,987

Go語言單向通道——通道中的單行道

Go 的通道可以在聲明時約束其操作方向,如只發送或是只接收。這種被約束方向的通道被稱做單向通道。

單向通道的聲明格式

只能發送的通道類型為chan<-,只能接收的通道類型為<-chan,格式如下:

var 通道實例 chan<- 元素類型    // 只能發送通道
var 通道實例 <-chan 元素類型    // 只能接收通道

  • 元素類型:通道包含的元素類型。
  • 通道實例:聲明的通道變量。

單向通道的使用例子

示例代碼如下:
ch := make(chan int)
// 聲明一個只能發送的通道類型, 并賦值為ch
var chSendOnly chan<- int = ch
//聲明一個只能接收的通道類型, 并賦值為ch
var chRecvOnly <-chan int = ch
上面的例子中,chSendOnly 只能發送數據,如果嘗試接收數據,將會出現如下報錯:

invalid operation: <-chSendOnly (receive from send-only type chan<- int)

同理,chRecvOnly 也是不能發送的。

當然,使用 make 創建通道時,也可以創建一個只發送或只讀取的通道:
ch := make(<-chan int)

var chReadOnly <-chan int = ch
<-chReadOnly
上面代碼編譯正常,運行也是正確的。但是,一個不能填充數據(發送)只能讀取的通道是毫無意義的。

time包中的單向通道

time 包中的計時器會返回一個 timer 實例,代碼如下:
timer := time.NewTimer(time.Second)
timer的Timer類型定義如下:
type Timer struct {
    C <-chan Time
    r runtimeTimer
}
第 2 行中 C 通道的類型就是一種只能接收的單向通道。如果此處不進行通道方向約束,一旦外部向通道發送數據,將會造成其他使用到計時器的地方邏輯產生混亂。

因此,單向通道有利于代碼接口的嚴謹性。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo