2016-04-22 29 views
3

在Go中可以創建單向通道。如果想要限制給定通道上的一組操作,這是一個非常方便的功能。但是,就我所知,此功能僅適用於函數的參數和變量的類型說明,而通過make創建單向通道對我來說看起來很陌生。我讀過這個question,但它不是關於在Go中創建只讀(或寫)頻道,而是關於一般用法。所以,我的問題是關於下一個代碼的使用情況:在Go中創建單向通道有什麼意義

writeOnly := make(chan<- string) 
readOnly := make(<-chan string) 
+0

真的沒有意義;不要定向渠道。 – JimB

+0

@JimB,你能解釋一下爲什麼嗎? –

+0

對於任何有用的東西,您都不能使用定向通道,除非永遠阻止,所以不需要創建一個通道。 – JimB

回答

3

理論上講,您可以使用只寫通道進行單元測試,以確保例如您的代碼不會超過特定次數寫入通道。

事情是這樣的:http://play.golang.org/p/_TPtvBa1OQ

package main 

import (
    "fmt" 
) 

func MyCode(someChannel chan<- string) { 
    someChannel <- "test1" 
    fmt.Println("1") 
    someChannel <- "test2" 
    fmt.Println("2") 
    someChannel <- "test3" 
    fmt.Println("3") 
} 

func main() { 
    writeOnly := make(chan<- string, 2) // Make sure the code is writing to channel jsut 2 times 
    MyCode(writeOnly) 
} 

但是,這將是單元測試非常愚蠢的方法。你最好創建一個緩衝通道並檢查其內容。

+0

嗯,我可以創建一個常規頻道並將它傳遞給期望只寫頻道的功能。 –

+1

對,如果採用非定向通道但我們想測試它的3-d方庫不讀/寫? –

1

其中一個主要的原因是人們使用類型(特別是在圍棋)是文檔的形式。能夠顯示頻道是隻讀還是隻寫,可以幫助API的使用者更好地瞭解正在發生的事情。

+2

當然你是對的。但我的問題不在於使用類型。它特別關於通過'make'創建單向通道。 –

+1

通道的方向性是類型的一部分 - 就像元素類型一樣。在[spec](https://golang.org/ref/spec#Channel_types) –

相關問題