在Go中可以創建單向通道。如果想要限制給定通道上的一組操作,這是一個非常方便的功能。但是,就我所知,此功能僅適用於函數的參數和變量的類型說明,而通過make
創建單向通道對我來說看起來很陌生。我讀過這個question,但它不是關於在Go中創建只讀(或寫)頻道,而是關於一般用法。所以,我的問題是關於下一個代碼的使用情況:在Go中創建單向通道有什麼意義
writeOnly := make(chan<- string)
readOnly := make(<-chan string)
在Go中可以創建單向通道。如果想要限制給定通道上的一組操作,這是一個非常方便的功能。但是,就我所知,此功能僅適用於函數的參數和變量的類型說明,而通過make
創建單向通道對我來說看起來很陌生。我讀過這個question,但它不是關於在Go中創建只讀(或寫)頻道,而是關於一般用法。所以,我的問題是關於下一個代碼的使用情況:在Go中創建單向通道有什麼意義
writeOnly := make(chan<- string)
readOnly := make(<-chan string)
理論上講,您可以使用只寫通道進行單元測試,以確保例如您的代碼不會超過特定次數寫入通道。
事情是這樣的: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)
}
但是,這將是單元測試非常愚蠢的方法。你最好創建一個緩衝通道並檢查其內容。
嗯,我可以創建一個常規頻道並將它傳遞給期望只寫頻道的功能。 –
對,如果採用非定向通道但我們想測試它的3-d方庫不讀/寫? –
其中一個主要的原因是人們使用類型(特別是在圍棋)是文檔的形式。能夠顯示頻道是隻讀還是隻寫,可以幫助API的使用者更好地瞭解正在發生的事情。
當然你是對的。但我的問題不在於使用類型。它特別關於通過'make'創建單向通道。 –
通道的方向性是類型的一部分 - 就像元素類型一樣。在[spec](https://golang.org/ref/spec#Channel_types) –
真的沒有意義;不要定向渠道。 – JimB
@JimB,你能解釋一下爲什麼嗎? –
對於任何有用的東西,您都不能使用定向通道,除非永遠阻止,所以不需要創建一個通道。 – JimB