Go语言单向通道——通道中的单行道
假如一个 channel 真的只能读取数据,那么它肯定只会是空的,因为你没机会往里面写数据。同理,如果一个 channel 只允许写入数据,即使写进去了,也没有丝毫意义,因为没有办法读取到里面的数据。所谓的单向 channel 概念,其实只是对 channel 的一种使用限制。
单向通道的声明格式
我们在将一个 channel 变量传递到一个函数时,可以通过将其指定为单向 channel 变量,从而限制该函数中可以对此 channel 的操作,比如只能往这个 channel 中写入数据,或者只能从这个 channel 读取数据。单向 channel 变量的声明非常简单,只能写入数据的通道类型为
chan<-,只能读取数据的通道类型为<-chan,格式如下:var 通道实例 chan<- 元素类型 // 只能写入数据的通道
var 通道实例 <-chan 元素类型 // 只能读取数据的通道
元素类型:通道包含的元素类型。
通道实例:声明的通道变量。
单向通道的使用例子
示例代码如下:
ch := make(chan int)
// 声明一个只能写入数据的通道类型, 并赋值为ch
var chSendOnly chan<- int = ch
//声明一个只能读取数据的通道类型, 并赋值为ch
var chRecvOnly <-chan int = ch
上面的例子中,chSendOnly 只能写入数据,如果尝试读取数据,将会出现如下报错:
invalid operation: <-chSendOnly (receive from send-only type chan<- int)
同理,chRecvOnly 也是不能写入数据的。当然,使用 make 创建通道时,也可以创建一个只写入或只读取的通道:
ch := make(<-chan int)
var chReadOnly <-chan int = ch
<-chReadOnly
上面代码编译正常,运行也是正确的。但是,一个不能写入数据只能读取的通道是毫无意义的。
time包中的单向通道
time 包中的计时器会返回一个 timer 实例,代码如下:
timer := time.NewTimer(time.Second)
timer的Timer类型定义如下:
第 2 行中 C 通道的类型就是一种只能读取的单向通道。如果此处不进行通道方向约束,一旦外部向通道写入数据,将会造成其他使用到计时器的地方逻辑产生混乱。type Timer struct {
C <-chan Time
r runtimeTimer
}
因此,单向通道有利于代码接口的严谨性。
关闭 channel
关闭 channel 非常简单,直接使用Go语言内置的 close() 函数即可:
close(ch)
在介绍了如何关闭 channel 之后,我们就多了一个问题:如何判断一个 channel 是否已经被关闭?我们可以在读取的时候使用多重返回值的方式:
x, ok := <-ch
这个用法与 map 中的按键获取 value 的过程比较类似,只需要看第二个 bool 返回值即可,如果返回值是 false 则表示 ch 已经被关闭。
- 随机文章
- 椰 马尔代夫(探索美丽的马尔代夫天堂)
- 延庆号称马尔代夫(梦幻海滩重现在延庆,叫你代替马代游!)
- 马尔代夫航班表(马尔代夫航班时刻表)
- 国内马尔代夫酒店(国内能感受马尔代夫风情的酒店推荐!)
- 厦门漳州马尔代夫(厦门漳州旅行团来到美丽的马尔代夫!)
- 保暖内衣马尔代夫(马尔代夫必备!暖心内衣供应需求增加)
- 回国梦见马尔代夫(梦中遇见马尔代夫,焕发回国梦的希望)
- 宝鸡马尔代夫大桥(宝鸡与马尔代夫间的海上大桥正式通车)
- 曲阜马尔代夫酒店(曲阜马尔代夫度假酒店:奢华体验天堂)
- 日本出发马尔代夫(日本旅游者奔赴马尔代夫寻找度假天堂)
- 岷县景区马尔代夫(岷县打造马尔代夫,打造美丽水上乐园)
- 海岛天堂马尔代夫(美丽的马尔代夫:一个美丽的海岛天堂)
- 来马尔代夫吃大餐(马尔代夫美食之旅:品尝海岛海鲜大餐)
- 磁县马尔代夫入口(磁县新建马尔代夫度假村,美如天堂!)
- 游戏中的马尔代夫(畅游极致天堂:探索马尔代夫旅游胜地)
- 贵阳马尔代夫攻略(贵阳直飞马尔代夫,轻松玩转海上仙境)
- 章丘马尔代夫简介(了解章丘马尔代夫:海洋豪华度假胜地)
- 福安小岛马尔代夫(福建小岛马尔代夫,旅游胜地等你来!)
- 辉县马尔代夫鱼种(辉县领养珍贵马尔代夫鱼成为新兴爱好)
- 苏州马尔代夫费用(探索美丽苏州马尔代夫,旅行费用揭秘)
- 马尔代夫不懂英语(马尔代夫存在英语障碍,游客需注意。)
- 解忧大队马尔代夫(华丽度假胜地!解忧大队抵达马尔代夫)
- 长征五号马尔代夫(长征五号成功将马尔代夫卫星送入太空)
- 重庆马尔代夫定位(重庆旅行社推出马尔代夫特色旅游产品)
- 马尔代夫云游攻略(马尔代夫旅游攻略:畅享云端岛屿之旅)
- 父母 马尔代夫(家庭度假:畅游马尔代夫)
- 马尔代夫个人养殖(马尔代夫推广个人养殖,带动经济发展)
- 直达马尔代夫航班(直飞马尔代夫航班,让您畅游蓝天碧海)
- 马尔代夫台风效果(马尔代夫受台风袭击,旅游业遭受损失)
- 马尔代夫出国打工(马尔代夫工作机会,外国人也可申请!)
