通道(channel)

在多个goroutine间通信的管道

单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。

通道的特性

Go语言中的通道(channel)是一种特殊的类型。

在任何时候,同时只能有一个goroutine访问通道进行发送和获取数据。

goroutine间通过通道就可以通信。

通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。

声明通道类型

var通道变量chan通道类型

通道类型:通道内的数据类型。

通道变量:保存通道的变量。

chan类型的空值是nil,声明后需要配合make后才能使用。

创建通道

通道是引用类型,需要使用make进行创建。

通道实例 := make(chan数据类型)
ch1 := make(chan int)

使用通道发送数据

通道发送数据的格式

通道的发送使用特殊的操作符“<-”

发送将持续阻塞直到数据被接收

把数据往通道中发送时,如果接收方一直都没有接收,那么发送操作将持续阻塞。

使用通道接收数据

通道接收同样使用“<-”操作符

特性:

  1. 通道的收发操作在不同的两个goroutine间进行。

  2. 接收将持续阻塞直到发送方发送数据。

  3. 每次接收一个元素

最后更新于