首先说一些结论:只有发送端可以close chan,接收端不要搞
1、重复 close,产生 panic
2、close一个nil,产生 panic
3、写未初始化chan永远阻塞
4、写close会panic
5、make chan返回的是* hchan,所以chan可以随意在函数和go间传递
channel 的主要结构:
一个环形数组实现的队列,用于存储消息元素;
两个链表实现的 goroutine 等待队列,用于存储阻塞在 recv 和 send 操作上的 goroutine;
一个互斥锁,用于各个属性变动的同步
channel make 实现
当元素不含指针的时候,会将整个 hchan 分配成一个连续的空间。
channel send
send 有以下几种情况:
- 写未初始化chan永远阻塞,写close会panic
- 有 goroutine 阻塞在 channel recv 队列上,此时缓存队列为空,直接将消息发送给 reciever goroutine,只产