在这里插入图片描述

基本操作
FIFO
通道容量
容量为0,非缓冲通道
容量大于0,缓冲通道
操作符
发送
channel <- param
接受
<-channel
特性
同意通道的发送操作之间互斥,接受操作之间互斥,接收和发送操作之间也是互斥
元素值从外界进入通道时会被复制,即进入通道的是元素的副本
发送和接收操作中对元素的操作是不可分割的
发送(接收)操作在完全完成前会被阻塞
阻塞
缓冲通道
通道已满,所有发送操作会被阻塞
当通道为空且等待队列中有等待的goroutine,元素值会直接复制给接收方
非缓冲通道
发送(接收)一开始会被阻塞,直到配对的操作开始执行
错误操作
对值为nil的通道(未初始化),操作会永久处于阻塞
通道为引用类型,零值为nil
已关闭的通道
发送操作会panic
再次关闭操作会panic
接收操作不会
通过接收表达式的第二个值来判断通道是否关闭可能有延时
如果通道关闭时尚有元素,接收表达式可以正常取出

总结
(错误操作)

不要在接收方关闭通道
高级操作
单项通道
make (chan<- int, 1)
用途
约束其他代码的行为
接口类型申明 type Notifier interface { SendInt(ch chan<- int) }
在实现SendInt方法,只能对ch进行发送操作
函数返回的结果列表中使用单项通道
select语句
每一个case表达式中只能包含操作通道的表达式
如果没有default,且所有case表达式都不满足,select会阻塞
select只能对每个case求值一次
select中使用break只会结束当前的select语句执行