登录
首页 >  Golang >  Go教程

Go语言单向通道——通道中的单行道

来源:云海天教程

时间:2022-12-24 20:02:19 238浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Go语言单向通道——通道中的单行道》,聊聊并发,希望可以帮助到正在努力赚钱的你。

Go语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel 只能用于发送或者接收数据。channel 本身必然是同时支持读写的,否则根本没法用。

假如一个 channel 真的只能读,那么肯定只会是空的,因为你没机会往里面写数据。同理,如果一个 channel 只允许写,即使写进去了,也没有丝毫意义,因为没有机会读取里面的数据。所谓的单向 channel 概念,其实只是对 channel 的一种使用限制。

单向通道的声明格式

我们在将一个 channel 变量传递到一个函数时,可以通过将其指定为单向 channel 变量,从而限制该函数中可以对此 channel 的操作,比如只能往这个 channel 写,或者只能从这个 channel 读。

单向 channel 变量的声明非常简单,只能发送的通道类型为chan,只能接收的通道类型为,格式如下:

var 通道实例 chanvar 通道实例 元素类型:通道包含的元素类型。通道实例:声明的通道变量。

单向通道的使用例子

示例代码如下:

ch := make(chan int)// 声明一个只能发送的通道类型, 并赋值为chvar chSendOnly chan上面的例子中,chSendOnly 只能发送数据,如果尝试接收数据,将会出现如下报错:

invalid operation: 同理,chRecvOnly 也是不能发送的。

当然,使用 make 创建通道时,也可以创建一个只发送或只读取的通道:

ch := make(上面代码编译正常,运行也是正确的。但是,一个不能填充数据(发送)只能读取的通道是毫无意义的。

time包中的单向通道

time 包中的计时器会返回一个 timer 实例,代码如下:

timer := time.NewTimer(time.Second)timer的Timer类型定义如下:

type Timer struct { C 第 2 行中 C 通道的类型就是一种只能接收的单向通道。如果此处不进行通道方向约束,一旦外部向通道发送数据,将会造成其他使用到计时器的地方逻辑产生混乱。

因此,单向通道有利于代码接口的严谨性。

关闭 channel

关闭 channel 非常简单,直接使用 Go语言内置的 close() 函数即可:

close(ch)

在介绍了如何关闭 channel 之后,我们就多了一个问题:如何判断一个 channel 是否已经被关闭?我们可以在读取的时候使用多重返回值的方式:

x, ok := 这个用法与 map 中的按键获取 value 的过程比较类似,只需要看第二个 bool 返回值即可,如果返回值是 false 则表示 ch 已经被关闭。

理论要掌握,实操不能落!以上关于《Go语言单向通道——通道中的单行道》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:云海天教程 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表