眾所周知,通道是并發(fā)運(yùn)行的goroutine之間的通信媒介,因此它們可以相互發(fā)送和接收數(shù)據(jù)。默認(rèn)情況下,通道是雙向的,但是您也可以創(chuàng)建單向通道。只能接收數(shù)據(jù)的通道或只能發(fā)送數(shù)據(jù)的通道,就是單向通道。單向通道也可以通過make()函數(shù)創(chuàng)建,如下所示:
//僅接收數(shù)據(jù) c1:= make(<- chan bool) //僅用于發(fā)送數(shù)據(jù) c2:= make(chan<-bool)
單向通道使用示例1:
package main import "fmt" func main() { //僅用于接收數(shù)據(jù) mychanl1 := make(<-chan string) //僅用于發(fā)送數(shù)據(jù) mychanl2 := make(chan<- string) //顯示通道的類型 fmt.Printf("%T", mychanl1) fmt.Printf("\n%T", mychanl2) }
輸出:
<-chan string chan<- string
在Go語言中,允許將雙向通道轉(zhuǎn)換為單向通道,換句話說,您可以將雙向通道轉(zhuǎn)換為僅接收或僅發(fā)送通道,但反之亦然。如下面的程序所示:
package main import "fmt" func sending(s chan<- string) { s <- "nhooo" } func main() { //創(chuàng)建雙向通道 mychanl := make(chan string) //在這里,sending()函數(shù)將雙向通道轉(zhuǎn)換為僅發(fā)送通道 go sending(mychanl) //在這里,通道只在goroutine內(nèi)部發(fā)送,而在goroutine之外,通道是雙向的,所以它打印nhooo fmt.Println(<-mychanl) }
輸出:
nhooo
單向通道的使用:單向通道用于提供程序的類型安全性,從而使程序產(chǎn)生的錯誤更少。或者,當(dāng)您要創(chuàng)建只能發(fā)送或接收數(shù)據(jù)的通道時,也可以使用單向通道。