眾所周知,通道是并發(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)生的錯(cuò)誤更少?;蛘?,當(dāng)您要?jiǎng)?chuàng)建只能發(fā)送或接收數(shù)據(jù)的通道時(shí),也可以使用單向通道。