Go语言channel教程

中的 默认是双向的,也就是既可以读也可以写,同时,我们还可以创建单向的 channel。单向 channel 也就是只能用于发送数据或者只能用于接收数据的 channel。

假如一个 channel 真的只能读,那么肯定只会是空的,因为你没机会往里面写数据。同理,如果一个 channel 只允许写,即使写进去了,也没有丝毫意义,因为没有机会读取里面的数据。所谓的单向 channel 概念,其实只是对 channel 的一种使用限制。

如果使用只读 channel 写数据,那么程序会编译错误,同样,如果使用只写 channel 接收数据,程序也会编译错误。单向的 channel 在声明之后,同样需要使用 之后,才可以使用,否则只是一个空 channel。

创建双向channel

语法

var chanName chan chanType

参数

参数 描述
var 声明变量使用的关键字。
chanName 管道变量名。
chan 声明管道变量类型使用的关键字。
chanType 管道变量的具体类型。

说明

我们声明了一个双向的 channel chanName,其 为 chan chanType。

创建只读channel

语法

var chanName <-chan chanType

说明

<-

创建只写channel

语法

var chanName chan<- chanType

说明

<-

案例

只读channel只能读数据

如果使用只读 channel 写入数据,程序编译报错

package main import ( "fmt" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // 创建一个只读channel readChannel := make(<-chan int) readChannel <- 1 }

程序运行后,控制台输出如下:

22_golang只读channel.png

首先,我们创建了一个只读的 channel readChannel,接着,使用该只读的 channel 去写入数据,我们发现程序编译报错。

只写channel只能写数据

如果使用只写 channel 读取数据,程序编译报错

package main import ( "fmt" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // 创建一个只写channel writeChannel := make(chan<- int) <-writeChannel }

程序运行后,控制台输出如下:

23_golang只写channel.png

首先,我们创建了一个只写的 channel 变量 writeChannel,接着,使用该只写的 channel 去读取数据,我们发现程序编译报错。

创建管道

使用 make 创建管道

package main import ( "fmt" ) // 接受一个只写 channel 作为参数 func producer(send chan<- int) { for i := 0; i < 3; i++ { send <- i } // 使用 close 关闭 channel close(send) } // 接受一个只读 channel 作为参数 func consumer(receive <-chan int) { for num := range receive { fmt.Println("receive num =", num) } } func main() { fmt.Println("嗨客网(www.haicoder.net)") // 创建一个双向channel channel := make(chan int) go producer(channel) consumer(channel) }

程序运行后,控制台输出如下:

24_golang单向channel通信.png

首先,我们使用 make 创建了一个双休的 channel,接着,我们创建了一个 producer 和一个普通 consumer。

其中,producer 接受一个只写的 channel ,并使用 使用只写的 channel 连续发送三次数据,之后,使用 close 。

consumer 接受一个只读的 channel 参数,并使用 使用只读的 channel 不停的接受数据,如果 channel 被关闭,那么该循环自动结束。

最后,运行程序,我们发现,我们使用了只写的 channel 写入的数据,通过只读的 channel 完全可以接受到,这样,就实现了通过只读 channel 和只写 channel 同样实现了通信。

Go语言单向channel总结

Golang 中的 channel 默认是双向的,也就是既可以读也可以写,同时,我们还可以创建单向的 channel。单向 channel 也就是只能用于发送数据或者只能用于接收数据的 channel。Go 语言创建双向 channel 语法;

var chanName chan chanType

Go 语言创建只读 channel 语法:

var chanName <-chan chanType