channel
-
channel的本质是一个线程安全的队列(可以存储interface{}类型的变量),遵循先进先出规则(FIFO),内部实现了同步,确保了并发安全!,可以解决协程之间的通信问题
-
channel有两种:无缓冲channel(初始容量为0),和有缓冲channel(初始容量不为0)
-
无缓冲channel:无缓冲通道的收发操作必须在不同的两个goroutine间进行,因为通道的数据在没有接收方处理时(没读时),数据发送方会持续阻塞(写的一方被阻塞,反之亦然),所以通道的接收必定在另外一个 goroutine 中进行。
-
有缓冲channel: 有缓冲channel的阻塞条件:
1)当缓冲通道被填满时,尝试再次发送数据会发生阻塞
2)当缓冲通道为空时,尝试接收数据会发生阻塞 -
channel默认为全双工的,但可以指定只读channel:
ch1 <- chan interface{}
和只写channel:ch2 chan <- interface{}
,全双工channel支持自动转型为只读或者只写channel -
channel的读操作符为
<-
比如data <- ch1
,且从通道读取数据时,可以有两个返回值,arg1是读取的值&#x