1、发送数据
1.1 直接发送数据
直接发送数据是指 如果已经有阻塞的接收goroutines
,那么数据将被直接发送给接收goroutine
1.2
缓冲区有可用空间
1.3 缓冲区无可用空间,goroutine要么直接返回要么阻塞等待
2、接收数据
2.1 直接接收数据
2.1.1 没有缓冲区,如果已经有阻塞发送的goroutines,
直接从阻塞的goroutine接收数据
2.1.2有缓冲区但缓冲区满了,则从缓冲区接收数据,如果有阻塞的goroutine则唤醒
2.2 缓冲区无数据,可以确定目前这个channel
既没有待发送的goroutine
,并且缓冲区也没有数据,goroutine要么直接返回要么阻塞等待
2.3 缓冲区有数据
3、chanel关闭
3.1 一个为nil
的channel
不允许进行关闭
3.2 不可以重复关闭channel
3.3 获取当前正在阻塞的发送或者接收的goroutine
,他们都处于挂起状态,然后进行唤醒。这是发送方不允许在向channel
发送数据了,但是不影响接收方继续接收元素,如果没有元素,获取到的元素是零值。使用val,ok := <-ch
可以判断当前channel
是否被关闭