「Golang」关于通道的一些总结
- 通道分为有缓冲与无缓冲,创建方式分别为make(chan type)或make(chan type ,0) 与make(chan type ,len)。
- 无缓冲通道在没有接收端或没有发送端的时候将会阻塞。
- 无缓冲通道可以完成两个go程的同步消息处理操作,并且无缓冲通道的接收数据会发生在唤醒放者之前。 如下图(画的不好见谅):
- 如果有缓冲通道在发送时发现队列已满,则发送方将等待直至接收方取出数据,如果队列为空则接收方同样等待发送方放入数据。
- for range 可以在一个未关闭的同道中循环接收数据,与
for { i, ok := <-ch if !ok { break } fmt.Println(i) }
等同,但当通道关闭时则会跳出循环。 - select{} 将会永久阻塞,即无任何case的select 会永久阻塞
- select的多个case满足则会随机选择,此特点是为了防止饥饿问题。
- 通道为nil时发送与接收均会阻塞,在select也会永不执行