Go入门: 浅谈channel

高手在线求帮请问一下,Go入门: 浅谈channel
最新回答
蔚蓝的心

2024-11-26 08:49:57

channel 管道在golang中是一个非常重要的概念,我之前模糊不清,对于 "输入管道" "输出管道" 所用到的 <- -> 经常分不清楚。

channel 是 goroutine 之间通信的一种方式,可以类比成 Unix 中的进程的通信方式管道。


channel 提供了一种通信机制,通过它,一个 goroutine 可以想另一 goroutine 发送消息。channel 本身还需关联了一个类型,也就是 channel 可以发送数据的类型。例如: 发送 int 类型消息的 channel 写作 chan int 。

channel在glang中实现了下面的一些功能:

1 数据交流:当作并发的 buffer 或者 queue,解决生产者 - 消费者问题。多个 goroutine 可以并发当作生产者(Producer)和消费者(Consumer)。

2 数据传递:一个 goroutine 将数据交给另一个 goroutine,相当于把数据的拥有权 (引用) 托付出去。

3 信号通知:一个 goroutine 可以将信号 (closing、closed、data ready 等) 传递给另一个或者另一组 goroutine 。

4 任务编排:可以让一组 goroutine 按照一定的顺序并发或者串行的执行,这就是编排的功能。

5 锁:利用 Channel 也可以实现互斥锁的机制。


channel 分: "只能接收" , “只能发送”, “可以接收也可以发送” 三种类型



//声明一个channel,这个channel只能保存int类型的数据。也就是说一端只能channel中写入int型的数据,另一段只能从channel中读取int型数据




关闭channel时,需注意:


从无缓存的 channel 中读取消息会 阻塞 ,直到有 goroutine 向该 channel 中发送消息;同理,向无缓存的 channel 中发送消息也会阻塞,直到有 goroutine 从 channel 中读取消息。

有缓存的 channel 的声明方式为指定 make 函数的第二个参数,该参数为 channel 缓存的容量

有缓存的 channel 类似一个阻塞队列(采用环形数组实现)。当缓存未满时,向 channel 中发送消息时不会阻塞,当缓存满时,发送操作将被阻塞,直到有其他 goroutine 从中读取消息;相应的,当 channel 中消息不为空时,读取消息不会出现阻塞,当 channel 为空时,读取操作会造成阻塞,直到有 goroutine 向 channel 中写入消息。