本节重点:
- 学会 Channel 的基本使用
上一篇我们讨论了如何在 Go 中使用 Goroutines 实现并发。在本节中,我们将讨论Channels以及 Goroutines 如何使用Channels进行通信。
什么是Channel
Channels可以被认为是 Goroutine 进行通信的管道。类似于水在管道中从一端流向另一端的方式,数据可以从一端发送并使用Channel从另一端接收。
声明Channel
每个Channels都有一个与之关联的类型。此类型是允许Channel传输的数据类型。不允许使用该Channel运输其他类型。
chan T
T是一个Channel类型
Channel的零值为nil
。nil
在Channels没有任何用处,因此必须使用make
类似于maps和slices来定义Channel。
package main
import "fmt"
func main() {
var a chan int
if a == nil {
fmt.Println("channel a is nil, going to define it")
a = make(chan int)
fmt.Printf("Type of a is %T", a)
}
}
在第 6 行声明的Channelsa
是nil
。因为Channels的零值是nil
。因此,执行 if 条件中的语句并定义Channels。在上面的程序中a
是一个 int Channels。该程序将输出:
channel a is nil, going to define it
Type of a is chan int
简写声明也是定义Channels的有效且简洁的方式。
a := make(chan int)
上面的代码行还定义了一个 int channel a
。
Channels发送和接收
Channels发送和接收数据的语法:
data := <- a // read from channel a
a <- data // write to channel a
箭头方向相对于Channel的指定数据是发送还是接收。
在第一行中,箭头指向外a,因此我们从Channels读取a并将值存储到变量data中