这是一篇后端实践选题,分析GOLANG的通道特点
通道
golang以语言层面的便捷高并发为特点,这主要归功于goruntine和chan。
golang有一句名言:“不要共享内存来通信,而是用通信来共享内存”。这句话就是只通道的理念和应用场景。
分别看看不同场景下对chan的读写操作会有什么结果
声明后-初始化前
这个阶段chan只声明了变量类型,但是没有分配空间,所以是nil。
写操作 发生阻塞
读操作 发生阻塞
初始化后-close前
这个阶段是最常见的场景阶段,能够正常使用chan
写操作 当通道缓存未满时 可以直接写入 缓存写满时则阻塞
读操作 当通道缓存为空时 会阻塞当前goruntine 当通道中有值时 可以读出
close后
我们也应该考虑一下通道关闭后客户端可能对通道进行操作
写操作 触发程序的panic
读操作 当通道中有值未读出就关闭通道时 读操作可以读出元素 布尔值也是true 当通道中没有值时 读操作会读出该通道元素类型的默认零值 布尔值为false
此外,通道也有一些不同的分类方式
无缓存通道
无缓存通道在声明时不指定大小ch := make(chan struct{})
无缓存通道在写入时会阻塞进程,除非此时已经有进程在读通道时阻塞,读操作则相反。
这种通道常用于进程同步
有缓存通道
有缓存通道在声明时需要指定大小ch := make(chan struct{}, 10)
这样就声明了一个长度为10,元素类型为空结构体struct{}的通道
这种通道常用于进程间异步传递数据
只读通道
只读通道在声明时需要声明只读符号ch := make(<-chan struct{})
这种通道是单向的,不能写,只能读
只写通道
只写通道在声明时需要声明只写符号ch := make(chan<- struct{})
这种通道是单向的,不能读,只能写
for range
有缓存通道还可以通过range遍历for k := range ch{}
每次循环从通道中读取一个值,通道为空时也会阻塞。
以上是我的一些简单理解,有不对的地方希望批评指正!