众所周知,通道是并发运行的goroutine之间的通信媒介,因此它们可以相互发送和接收数据。默认情况下,通道是双向的,但是您也可以创建单向通道。只能接收数据的通道或只能发送数据的通道,就是单向通道。单向通道也可以通过make()函数创建,如下所示:
//仅接收数据
c1:= make(<- chan bool)
//仅用于发送数据
c2:= make(chan<-bool)
单向通道使用示例:
package main
import "fmt"
func main() {
//仅用于接收数据
mychanl1 := make(<-chan string)
//仅用于发送数据
mychanl2 := make(chan<- string)
//显示通道的类型
fmt.Printf("%T", mychanl1)
fmt.Printf("\n%T", mychanl2)
}
输出:
<-chan string
chan<- string
将双向通道转换为单向通道
在Go语言中,允许将双向通道转换为单向通道,换句话说,您可以将双向通道转换为仅接收或仅发送通道,但反之亦然。如下面的程序所示:
双向通道转为单向通道示例:
package main
import "fmt"
func sending(s chan<- string) {
s <- "sfjvip"
}
func main() {
//创建双向通道
mychanl := make(chan string)
//在这里,sending()函数将双向通道转换为仅发送通道
go sending(mychanl)
//在这里,通道只在goroutine内部发送,而在goroutine之外,通道是双向的,所以它打印sfjvip
fmt.Println(<-mychanl)
}
输出:
sfjvip
单向通道的使用:单向通道用于提供程序的类型安全性,从而使程序产生的错误更少。或者,当您要创建只能发送或接收数据的通道时,也可以使用单向通道。