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

10.3.5 channel的传递

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

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

10.3.5  channel的传递

需要注意的是,在Go语言中channel本身也是一个原生类型,与map之类的类型地位一样,因此channel本身在定义后也可以通过channel来传递。

可以使用这个特性来实现Linux/UNIX非常常见的管道(pipe)特性。管道也是使用非常广泛的一种设计模式,比如在处理数据时,可以采用管道设计,这样可以比较容易以插件的方式增加数据的处理流程。

下面利用channel可被传递的特性来实现管道。为了简化表达,假设在管道中传递的数据只是一个整型数,在实际的应用场景中通常会是一个数据块。

首先限定基本的数据结构:

  1. type PipeData struct {  
  2.     value   int  
  3.     handler func(int) int  
  4.     next    chan int  
  5. }  

然后写一个常规的处理函数。只要定义一系列PipeData的数据结构并一起传递给这个函数,就可以达到流式处理数据的目的:

  1. func handle(queue chan *PipeData) {  
  2.     for data :range queue {  
  3.         data.next <- data.handler(data.value)  
  4.     }  
  5. }  

这里只给出了大概的样子,限于篇幅不再展开。同理,利用channel这个可传递特性,可以实现非常强大、灵活的系统架构。相比之下,在C++、Java、C#中,要达成这样的效果,通常就意味着要设计一系列接口。

与Go语言接口的非侵入式类似,channel的这些特性也可以大大减少开发时间,用一些比较简单却实用的方式来达成在其他语言中需要使用众多技巧才能达成的效果。


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

51CTO读书频道二维码


51CTO读书会第9群:808517103

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

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

读 书 +更多

精通EJB 3.0

本书是关于EJB 3.0的专业技术教程,专注于EJB的概念、方法、开发过程的介绍。同时,本书还研究许多高端的EJB知识,使得开发者能够真正理解...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊