|
|
51CTO旗下网站
|
|
移动端

10.3.6 单向channel

《Go语言编程入门与实战技巧》第10章并发编程,本章Go语言里的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为协程(goroutine)时,Go语言会将其视为一个独立的工作单元,这个单元会被调度到可用的逻辑处理器上执行。本节为大家介绍单向channel。

作者:黄靖钧来源:电子工业出版社|2018-09-23 09:52

10.3.6  单向channel

顾名思义,单向channel只能用于发送或者接收数据。channel本身必然是同时支持读写的,否则根本没法用。假如一个channel真的只能读,那么肯定只会是空的,因为你没机会往里面写数据。同理,如果一个channel只允许写,即使写进去了,也没有丝毫意义,因为没有机会读取里面的数据。所谓的单向channel概念,其实只是对channel的一种使用限制。

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

单向channel变量的声明非常简单,例如:

  1. var ch1 chan int // ch1是一个正常的channel,不是单向的  
  2. var ch2 chan<- float64 // ch2是单向channel,只用于写float64数据  
  3. var ch3 <-chan int // ch3是单向channel,只用于读取int数据  

关于单向channel的初始化,之前已经提到过,channel是一个原生类型,因此不仅支持被传递,还支持类型转换。只有在介绍了单向channel的概念后,读者才会明白类型转换对于channel的意义:在单向channel和双向channel之间进行转换。示例如下:

  1. ch4 :make(chan int)  
  2. ch5 :<-chan int(ch4) // ch5就是一个单向的读取channel  
  3. ch6 :chan<- int(ch4) // ch6是一个单向的写入channel  

基于ch4,通过类型转换初始化了两个单向channel:单向读的ch5和单向写的ch6。

为什么会这样限制呢?从设计的角度考虑,所有的代码应该都遵循"最小权限原则",从而避免没必要的使用泛滥问题,进而导致程序失控。写过C++程序的读者肯定就会联想起const指针的用法。非const指针具备const指针的所有功能,将一个指针设定为const就是明确告诉函数实现者不要试图对该指针进行修改。单向channel也是起到这样的一种契约作用。

我们来看看单向channel的用法:

  1. func Parse(ch <-chan int) {  
  2.     for value :range ch {  
  3.         fmt.Println("解析后的值为:", value)  
  4.     }  
  5. }  

除非这个函数的实现者使用了类型转换,否则这个函数就不会因为各种原因而对ch进行写,避免在ch中出现非期望的数据,从而很好地实践最小权限原则。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读—-网络安全

本书共10章,介绍的内容包括恶意软件(包括病毒、木马和蠕虫等)的深度防御方法,黑客的主要类型和防御方法,企业网络内、外部网络防火墙系...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊