Go微服务实战
上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读取,则通道一直阻塞。