Golang提供了一种称为通道的机制,用于在协程之间共享数据。当函数作为协程执行并发活动时,需要它们共享资源或数据,通道便充当协程之间的管道(管道),提供一种确保同步交换数据的机制。
需要在声明通道时指定数据类型,可以共享任何类型的值和指针。数据在通道上传递:在任何给定的时间,只有一个协程可以访问数据项:因此在设计上是不会发生资源竞争的情况。
根据数据交换的行为,有两种类型的通道:无缓冲通道和缓冲通道。无缓冲通道用于在协程之间执行同步通信,而缓冲通道用于执行异步通信。在发送和接收数据瞬间,无缓冲通道保证数据交换是在两个协程之间执行,缓冲通道没有这样的保证。
通道由make函数创建,该函数指定chan关键字和通道的元素类型。
创建无缓冲和有缓冲的通道
内置函数make能够用来创建无缓冲和有缓冲的通道,参数指定chan关键字和的要交换的数据类型
使用操作符
从通道中取出值
无缓冲通道
无缓冲通道没有指定容量来保存值。因此,在传输任何数据之前,这种类型的通道要求发送和接收数据的协程在同一时刻都要准备就绪。如果两个协程在相同的时刻还未准备好,则通道将使执行数据传输的两个协程阻塞等待对方。同步是在通道上发送和接收数据的基础,发送和接受数据双方一个都不能少。
缓冲通道
缓冲通道有指定的容量来保存值。这种类型的通道,不强制传输数据的协程双方在同一时刻准备好执行发送和接收,通过阻塞协程来协调双方的通信。与无缓冲通道不同,缓冲通道发送或接收的阻塞有不一样的情况:只有在通道中没有要接收的值时,接收方会阻塞;只有在没有可用缓冲区来放置要发送的值时,发送方才会阻塞。
每次运行此程序时,输出的结果不同,这是因为程序和Go调度程序的随机性。
在上面的程序中,创建一个字符串类型的缓冲通道,其容量为10。WaitGroup的计数是5,代表5个协程。将10个字符串发送到通道中,以模拟协程所要做的工作。最后一个字符串发送到通道后,通道将关闭,主函数将等待所有项目完成。