在go语言中,goroutine类似线程但比线程还要小一个级别,称为go协程,可以更充分的利用CPU的资源,channel管道可以实现goroutine之间的通信。goroutine+channel是go语言最大的优势,也是go语言写服务的主要依靠。channel分为无缓冲和有缓冲两种。
无缓冲通道指当一个对象向通道写数据的时候,通道的两端都是阻塞状态,这时其他对象也访问不了该通道,直到通道另一端的对象把数据拿出来,通道两端的程序才能继续往下跑,其他的对象才能继续向通道写数据。
有缓冲通道指当创建一个通道时,指定通道的最大值,通道内有个计数器,初始值为零,每当有对象向通道写数据的时候,计数值减一,当有对象向通道拿数据的时候,计数值加一,当计数值等于最大值时,不能向通道内写数据,但可以向通道拿数据,当计数值小于最大值时,才可以继续向通道写数据。通道内的数据是按写数据的顺序排列的,也就是先进先出,后进后出。
channel可以看做是管道,但不能当管道用,它内部的通讯都是通过信号来传递的。当close一个管道的时候并不是真的关闭了这条管道,只是不能继续向管道写数据了,但还能向管道拿数据,直到管道内所有数据都被拿出来,才算真的关闭了这条管道。
for value := range ch { //通道关闭后,循环自动结束
fmt.println(value)
}
如果是无缓冲通道,来一个数据就循环一次。
如果是有缓冲通道,就要等通道满后才开始循环。