GO语言入门指南-chan | 青训营

163 阅读2分钟

这是一篇后端实践选题,分析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{}

每次循环从通道中读取一个值,通道为空时也会阻塞。

以上是我的一些简单理解,有不对的地方希望批评指正!