通过发送和接收交换值
并发活动需要把数据交给彼此,通道为这种交接提供对象与操作。Go的通道指定元素类型,还可以把接口限制为只发送或只接收,使一段代码能做的通信方向由类型表达。
Go允许多个goroutine共同使用同一个通道,通道本身遵守相应并发操作规则。但传递的值若还引用共享数据,程序依然要核对那份数据后续如何使用;通道不是把全部关联对象都自动变成私有副本的机制。
参考:[1]
容量改变等待条件
无缓冲Go通道需要发送者与接收者都就绪,通信才能成功;有缓冲通道则允许在未满时发送、非空时接收。容量因而同时影响存储与同步,不能把它只看成性能调节数字。
nil通道不会准备好通信,关闭通道又是另一种状态。接收操作可以报告是否取得了关闭之前发送的值;结束协议需要区分没有数据、暂时没有就绪伙伴以及通道已经关闭,避免把这些情况都解释成普通空结果。
参考:[1]
通信建立特定同步关系
Go内存模型规定一次发送与对应接收完成之间的同步关系,无缓冲通道还具有接收与发送完成之间的相应约束。把通道改为有缓冲形式时,某些依赖原来会合顺序的推理可能不再成立。
select可以在若干通信操作中选择能推进的一项;多项就绪时按语言规则选择,而不是自动遵守代码中的优先级。用通道建立正确协议,需要把值、等待关系和选择规则一起考虑。