上QQ阅读APP看书,第一时间看更新
5.2.3 以channel作为函数参数
Go语言程序在把channel作为函数参数的时候指定通道方向,通道有两种类型:无方向通道和双向通道,默认的是双向通道。
注意
当使用通道作为函数参数的时候,可以指定通道的方向,也就是指定该通道是发送数据还是接收数据。
下面来看两种写法,先看第一种:
func one (c chan int, x int){ fmt.Println(x) c <- x } func two(c chan<- int, x int){ fmt.Println(x) c<-x }
one和two两个函数实现的功能是相同的,但显然在写法上,特别是在通道参数的定义上是不同的。two这个函数的定义就是带有方向的通道,可以看到c在定义的时候chan的右侧有一个“<-”,说明c通道只能用于写入数据。如果试图从只写通道读取数据的话,编译器会报错。
注意
在函数外面定义双向channel: c := make(chan int),它作为参数传到函数two(c,3)后,进行了隐式转换,通道c由双向通道变为参数指定方向chan<-。但反过来是不行的,也就是不允许单向通道变为双向通道。
同样,也可以定义只读通道,示例如下:
func three(out chan<- int, in<-chan int){ for v:= range in{ out <- v } }
上面是一个只读通道和一个只写通道的例子。
注意
到目前为止,对于channel的讨论都是在无缓存channel的范围内。无缓存channel的特点就是同步,一个channel写入数据后,如果没有其他goroutine读取,则通道一直阻塞。