Go 语言通道(channel)
上一节我们介绍了协程(goroutine)的概念和用法,但是单纯地将函数并发执行是没有意义的,函数与函数间需要交换数据才能体现并发执行函数的意义。Go 语言为 goroutine 间的数据交换提供了一种简单的方法 —— 通道(channel)。
Go 语言中的通道(channel)是一 种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出的规则,保证收发数据的顺序。Go 的每一个通道都是一个具体类型的导管,因此声明 channel 的时候需要为其指定元素类型。同时,通道还提供了同步机制,确保数据在发送和接收之间的安全传递,可以有效地避免竞态条件和死锁等并发问题。
提示
本文所有示例代码可在 GitHub 下载。
通道的创建
声明通道类型变量需要使用 chan
关键字,语法格式如下:
var 变量名 chan 元素类型
注意:声明通道时需要指定元素类型,即通道中传递的元素的类型。
例如:
var a chan int // 声明一个传递 int 类型数据的通道
var b chan string // 声明一个传递 string 类型数据的通道
var c chan bool // 声明一个传递 bool 类型数据的通道
初始化通道
未经初始化的通道默认值为 nil
,需要使用 make()
函数初始化之后才能使用,语法格式如下:
make(chan 数据类型, [缓冲大小])
其中 channel 的缓冲大小是可选的。
例如:
ch := make(chan int) // 创建一个传递 int 类型数据的通道
ch := make(chan int) // 创建一个传递 int 类型数据、缓冲大小为10的通道