channel是什么意思(简介channel常见用法)( 二 )




生产者往队列当中传输数据,消费者进行消费,唯一不同的是这个队列的容量是1,必须要生产和消费端都准备就绪了才会进行数据传输 。

chan的缓冲

前文说了,chan的容量只有1,只有消费端和生产端都就绪的时候才可以传输数据 。我们也可以给chan加上缓冲,如果消费端来不及把所有的数据都消费完,允许生产端先把数据暂时存在chan当中,先不发生阻塞,只有在chan满了之后才会阻塞 。


用法也很简单,我们在通过make创建chan的时候多加上一个参数表示容量即可,和我们之前创建切片的道理很类似 。


Ch := make(chan int, 100)

比如这样,我们就创建了一个缓冲区为100的信道 。


但多说一句,其实这种情况不太常用,原因也很简单 。因为上下游的消费情况是统一的,如果生产者生产的速度过快,而消费端跟不上的话,即使把它先暂存在缓冲区当中也没什么用,早晚还是会要阻塞的 。


close

当我们对信道使用结束之后,可以通过close语句将它关闭 。


Close这个操作只能在生产端进行,消费端如果close信道会引发一个panic 。我们在从chan接收数据的时候,可以加上一个参数判断信道是否关闭 。


v, ok := <- chif !ok { return}

这样我们就可以判断chan关闭的时间了 。