今天是golang专题第15篇文章,我们来继续聊聊channel的使用。

在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计,可以理解为生产消费者模式当中的队列。但channel和队列不一样的是,golang当中集成了一些其他的用法,使得我们的使用更加灵活,开发并发相关的功能更加简单。

select机制

我们来思考一个问题,假设我们的数据源有多个,也就是说我们可能会从多个入口获取数据,但是我们并不知道这些数据源当中哪个先把数据准备好。我们希望实现轮询这些channel,哪个数据准备好了就读取哪个,否则就阻塞等待,这个功能应该怎么办呢?

我们当然可以自己用循环来实现,但是这显然是不合理的,golang当中针对这个问题提供了专门的解决方法,它就是select关键字。

select机制并不是golang这门语言独创的,早在Unix时代就有了select机制。通过select函数监控一系列文件的句柄,一旦其中一个发生了改动,select函数就会返回。而golang当中的select则用来在channel当中进行选择,有点像是switch,写出来的代码大概是这个样子:

select 

select后面跟多个case以及default,其中default并不是必须的case后面必须要接一个chan的操作,可以是从一个chan当中读入数据,也可以是向一个chan当中写入数据。如果所有的case都不成功,则会进入default语句当中,如果没有default语句,那么select会陷入阻塞。

一般情况下我们使用select是为了从多个数据源中获取数据,当多个chan同时有数据的时候,使用select可以让我们避免判断哪个数据源数据ready的问题。

range机制

我们之前在介绍slice遍历的时候曾经介绍过range机制,我们可以通过range来遍历一个数组或者是map。就像是这样:

arr 

很多时候我们会把这个用法当做是迭代器的迭代,就像是Java和Python中的那样。但实际上range机制的底层原理是chan,当我们使用range的时候,它表示会不断地从chan当中接受值,直到它关闭。

所以我们也可以这样遍历一个chan当中的数据:

ch 

超时机制

有没有想过一个问题,channel的写入和写出都是阻塞的,也就是说如果是从chan当中读取数据,必须要上游已经传输了才可以读取到。同样,如果往没有缓冲区的chan写入数据也需要下游消费了才能写入成功。阻塞往往是有很大隐患的,如果处理不好很容易导致整个程序锁死。

我们需要设计机制来解决这个问题,比较好的方案就是设置定时器,如果超过一定的时间chan还没有响应成功的话,那么就人工停止程序。这一点说起来还有点麻烦的,比如我们要启动一个定时器,要手动终止goroutine,但是结合select机制其实并不难实现,我们来看代码。

timeout 

说白了很简单,也就是我们额外启动一个goroutine做休眠操作,当休眠结束之后也通过chan发送消息,这样如果我们select先接受到了timeout的信号就说明了程序已经超时了。当然这只是一个很简单的demo,实际使用的话需要考虑的情况可能还会更多。

channel传递

有没有想过一个问题,既然chan可以传输任何类型的数据,那么我们能不能用一个chan传输一个chan呢?

这样的操作是可以的,因为在有些场景当中相比于直接把数据传输给下游,我们传输读取数据的chan可能更加方便。有点授人以渔的意思,更加厉害的是我们可以结合函数式编程,把处理数据的函数一并传输给下游。这样下游读取到数据,并且用读取到的处理函数来处理,这样可以更加定制化,如果以后数据和处理方式都发生改动,也只需要在上游修改,可以更加解耦。

我们同样来看一个demo:

type 

这只是一个简单的案例,想要在实际应用当中真的使用上还需要定义大量的接口以及做很多设计。我们只需要知道有这么一种设计模式和用法就可以了。

单向channel

最后,我们来说说单向channel,也就是说我们指定channel是只读的或者是只写的。但其实这是一个伪命题,原因也很简单,如果只写数据没人读,或者是只读但是不能写,那么这个channel有什么用呢?只有有人读有人写才可以完成数据流通不是吗?

的确如此,所以这里所说的单向channel其实并不是真正意义上的单向,只是说我们为了规范,对使用方进行限制。比如说我们限定在消费函数当中不能写入,在生产函数当中不能消费。我们在通过函数传递chan的时候,可以通过加上限定让chan在函数当中变成单向的。

var 

除此以外我们还可以把一个正常的chan转化成单向的chan:

var 

我们一般不在程序当中做这样的转化,而是用在函数参数当中,这也主要是为了起到规范的作用。

func 

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

- END -

Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作​mp.weixin.qq.com

java case用法_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作相关推荐

  1. channelinactive触发后不关闭channel_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作...

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  2. c语言数据类型int的用法,C语言基本数据类型:整型(int)用法详解|C语言学习

    C语言基本数据类型:整型(int)用法详解 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.以后, ...

  3. c++ 初始化 代码 应放在那里_Go语言goroutine调度器初始化 (12)

    先吐槽一下,知乎编辑器居然不支持汇编语言,代码的空格也给我弄没了,你说你把运算符两边的空格搞掉就搞掉吧,还能看,你为啥要把if, for后面的空格也搞掉啊... 本文是<Go语言调度器源代码情景 ...

  4. request用法_Go 语言 Web 应用开发 第 04 课:高级模板用法

    在上一节课中,我们学习了标准库中 text/template 包提供的文本模板引擎的逻辑控制.集合对象迭代和空白符号处理的用法.这节课,我们将学习标准库模板引擎中的一些高级概念和使用方法,并将渲染结果 ...

  5. c语言表达式用法,C语言开发之运算符、表达式用法

    C语言中运算符和表达式数量之多,在高级语言中是少见的.正是丰富的运算符和表达式使C语言功能十分完善.这也是C语言的主要特点之一.C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性.在 ...

  6. go语言入门经典_Go 语言中的 gRPC 基础入门

    01 为什么使用 gRPC? 借助 gRPC,我们可以在 .proto 文件中一次定义我们的服务,并以 gRPC 支持的任何语言生成客户端和服务器代码,无论是在大型数据中心内的服务器,还是在个人的电脑 ...

  7. hibernate createsqlquery delete多个表_go语言教程哪里有?xorm表基本操作及高级操作...

    在上节内容中,我们介绍了xorm框架表结构的映射规则和表结构的操作.本节课,继续来深入学习表结构基本操作和高级查询的相关功能. 表结构基本操作 对表结构的操作最常见的操作是查询和统计相关的方法,我们首 ...

  8. C语言Double的作用,C语言double和float 实例分析用法

    C语言double和float 实例分析用法 C语言double和float 实例分析用法 小数也称实数或浮点数.例如,0.0.75.0.4.023.0.27.-937.198 都是合法的小数.这是常 ...

  9. c语言float的使用,C语言double和float实例分析用法

    C语言double和float 实例分析用法 C语言double和float 实例分析用法 小数也称实数或浮点数.例如,0.0.75.0.4.023.0.27.-937.198 都是合法的小数.这是常 ...

最新文章

  1. c语言如何输出整串链表,大神帮我看一下怎么输入输出一个链表,我输入了但是没输出啊...
  2. JAVA学习笔记--初识容器类库
  3. drbd heartbeat mysql_Heartbeat+DRBD+MySQL Replication故障处理
  4. 数据类型之Integer与int
  5. bzoj2460 [BeiJing2011]元素 贪心+线性基
  6. 测试nignx php请求并发数,Nginx 高级篇(八)ab 压力测试即 nginx 的性能统计模块...
  7. TOGAF架构学习总结
  8. 怎么用虚拟机安装Windows XP?
  9. 新编计算机基础教程考试知识点,新编计算机基础教程
  10. 详解智慧城市排水管理系统整体方案
  11. Windows下使用Git+rsync构建文件同步工具
  12. 【语义分割】3、用mmsegmentation训练自己的分割数据集
  13. IOS应用版本号设置
  14. 标准符号代表的意思汇总
  15. css img 等比例自动缩放
  16. 汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)
  17. 移动设备无线投屏到电视机
  18. 印度旅游业的兴衰,如同喜马拉雅山,连绵起伏 | 经济学人全球早报精选
  19. mac远程连接腾讯云虚拟机
  20. 学3Dmax有前途吗? 3Dmax有哪些就业方向?

热门文章

  1. Win11正式版版号 Win11正式版最新版本号介绍
  2. SpringBoot整合springDataJPA
  3. java后台与ISO端app对接
  4. activiti(7.0) 组任务流程CandidateUsers
  5. mysql执行语句返回主键_mysql语句insert后返回主键
  6. java中有哪几种访问修饰符_Java语言中有4种访问修饰符
  7. 正则除了几个汉字的其它汉字_理解汉字的几个层次
  8. JavaScript里的父、子节点操作源码解析
  9. Halcon图像预处理与形态学(图像的滤波)
  10. 每天多采一半油!中东联手中国阿里云的研究有望降低国际油价