默認(rèn)情況下,通道是雙向的,也就是,既可以往里面發(fā)送數(shù)據(jù)也可以同里面接收數(shù)據(jù)。
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、平城ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的平城網(wǎng)站制作公司
但是,我們經(jīng)常見一個通道作為參數(shù)進(jìn)行傳遞而值希望對方是單向使用的,要么只讓它發(fā)送數(shù)據(jù),要么只讓它接收數(shù)據(jù),這時候我們可以指定通道的方向。
單向channel變量的聲明非常簡單,如下:
var ch2 chan int // ch2是一個正常的channel,不是單向的
var ch3 chan<- float64 // ch3是單向channel,只用于寫float64數(shù)據(jù)
var ch4 <-chan int // ch4是單向channel,只用于讀取int數(shù)據(jù)
l chan<- 表示數(shù)據(jù)進(jìn)入管道,要把數(shù)據(jù)寫進(jìn)管道,對于調(diào)用者就是輸出。
l <-chan 表示數(shù)據(jù)從管道出來,對于調(diào)用者就是得到管道的數(shù)據(jù),當(dāng)然就是輸入。
可以將 channel 隱式轉(zhuǎn)換為單向隊列,只收或只發(fā),不能將單向 channel 轉(zhuǎn)換為普通channel:
c := make(chan int, 3)
var send chan<- int = c // send-only
var recv <-chan int = c // receive-only
send <- 1
//<-send //invalid operation: <-send (receive from send-only type chan<- int)
<-recv
//recv <- 2 //invalid operation: recv <- 2 (send to receive-only type <-chan int)
//不能將單向 channel 轉(zhuǎn)換為普通channel
d1 := (chan int)(send) //cannot convert send (type chan<- int) to type chan int
d2 := (chan int)(recv) //cannot convert recv (type <-chan int) to type chan int
示例代碼:
// chan<- //只寫
func counter(out chan<- int) {
defer close(out)
for i := 0; i < 5; i++ {
out <- i //如果對方不讀 會阻塞
}
}
// <-chan //只讀
func printer(in <-chan int) {
for num := range in {
fmt.Println(num)
}
}
func main() {
c := make(chan int) // chan //讀寫
go counter(c) //生產(chǎn)者
printer(c) //消費者
fmt.Println("done")
}