通道类型是Go语言自带的、唯一一个可以满足并发安全性的类型,在声明并初始化一个通道时,需要用到内建函数make,传给make函数的第一个参数应该代表通道的具体类型的类型字面量。

  如类型字面量 chan int,其中chan表示通道类型的关键字,而int说明了该通道类型的元素类型。

  在初始化通道时,make函数除了必须接受这样的字面量作为参数,还可以接收一个int类型的参数。后者是可选的,用于表示通道的容量(通道最多缓存多少个元素值),不能小于0。当容量为0时称其为非缓冲通道,当容量大于0时,可以称为缓冲通道

  一个通道相当于一个先进先出(FIFO)的队列。元素值的发送和接收都需要用到操作符  <-

 1 package main
 2
 3 import "fmt"
 4
 5 func main() {
 6     ch1 := make(chan int, 3)
 7     ch1 <- 2
 8     ch1 <- 1
 9     ch1 <-3
10     elem1 := <-ch1
11     fmt.Printf("first element :%v\n", elem1)
12 }

  由于该通道容量为3,所以可以在通道不包含任何元素值的时候,连续地向该通道发送三个值,此时这三个值都会被缓存在通道之中。当从通道接收元素值的时候,同样要用接送操作符 <-

1、对通道的发送和接收操作都有哪些基本的特性?

  1)对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的

    在同一时刻,Go语言的运行时系统只会执行对同一个通道的任意个发送操作中的某一个,知道这个元素值被完全复制进该通道之后,其他针对该通道的发送操作才可能被执行

    类似的,在同一时刻,运行时系统也只会执行对同一个通道的任意个接收操作中的某一个,直到这个元素值完全被移除该通道之后,其他针对该通道的接收操作才可能被执行。

    另外,对于通道中的同一个元素值来说,发送操作和接收操作也是互斥的,虽会出现正在被复制进通道但还未复制完成的元素值,但此时它绝不会被想接收它的一方看到和取走

    并且,元素值从外界进入通道时会被复制,进入通道的并不是接收操作符右边那个元素值,而是它的副本。

  2)发送操作和接收操作中对元素值的处理都是不可分割的

    不可分割的意思是处理元素值时是一气呵成不会被打断的

    发送操作要么还没复制元素值,要么已经复制完毕,绝不会出现只复制一部分的情况

    接收操作在准备好元素值的副本之后,一定会删除通道中的原值,绝不会出现通道中仍有残留的情况

    对于通道中的桶一个元素值来说,它只可能是某一个发送操作放入的,同时也只可能被某一个接收操作取出

  3)发送操作在完成之前会被阻塞,接收操作也是

    发送操作包括“复制元素值”和“放置副本通道内部”两个步骤,在这两个步骤完全完成之前,发起这个发送操作的那句代码会一直阻塞在那里,在它之后的代码不会有执行的机会,直到这句代码阻塞解除。在通道完成发送操作之后,运行时系统会通知这句代码所在                 的goroutine,以使它去争取继续运行代码的机会

    接收操作包括“复制通道内的元素”,“放置副本到接收方”,“删掉原值”三个步骤,同理在这些步骤完全完成之前,发起该操作的代码也会一直阻塞。

2、发送操作和接收操作在什么时候可能被长时间阻塞

  1)缓冲通道

    如果通道已满,那么对它的所有发送操作都会被阻塞,直到通道中有元素值被接收走。通道会优先通知最早等待的那个发送操作所在的goroutine,通知的顺序总是公平的

    如果通道已空,那么对它的所以接收操作都会被阻塞,直到通道中有新的元素值出现,通道会优先通知最早等待的那个接收操作所在的goroutine,通知的顺序总是公平的

  2)非缓冲通道

    无论发送操作还是接收操作,一开始执行就会被阻塞,直到配对的操作也开始执行。即非缓冲通道是在用同步的方式传递数据,也就是说,只有收发双方对接上了,数据才会被床底,数据是直接从发送方复制到接收方的,中间并不会用非缓冲通道做中转

  3)对值为nil的通道

    不论它的具体类型是什么,对它的发送操作和接收操作都会永久地处于阻塞状态,它们所属的goroutine中的任何代码,都不会被执行。因此一定要初始化通道

3、发送操作和接收操作在什么时候会引发panic?

  对于一个已初始化,但并未关闭的通道来说,收发操作一定不会引发panic,但通道一旦关闭,再对它进行发送操作,就会引发panic。

  如果试图关闭一个已经关闭了的通道,也会引发panic

  当把接收表达式结果同时赋值给两个变量时,第二个变量的类型就是一定bool类型,它的值如果是False就说明通道已经关闭,并且再没有元素值可取。如果通道关闭时,里面还有元素值未被取出,那么接收表达式的第一个结果仍会是通道中的某一个元素值,而第二个结果值一定会是true

转载于:https://www.cnblogs.com/yuxiaoba/p/9577212.html

[Go]通道(channel)的基本操作相关推荐

  1. java nio channel原理_Java NIO 选择器(Selector)与通道(Channel) 原理 | 学步园

    NIO底层实现poll, epoll(jdk1.5update 9  和jdk1.6  仅限于 linux 2.6以上 ) Java NIO 选择器(Selector) 知识预备 (linux epo ...

  2. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例

    文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...

  3. 【Netty】NIO 通道 ( Channel ) 组件

    文章目录 I . 通道 ( Channel ) 概念简介 II . 通道 ( Channel ) 常用类 III . 常用的 通道 ( Channel ) 之 套接字通道 ( SocketChanne ...

  4. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

  5. java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取

    通道(Channel): 由java.nio.channels包定义的,Channel表示IO源与目标打开的连接,Channel类似于传统的"流",只不过Channel本身不能直接 ...

  6. Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O

    I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CP ...

  7. 卷积网络中的通道(channel)和特征图(feature map)

    卷积网络中的通道(Channel)和特征图 转载自:https://www.jianshu.com/p/bf8749e15566 今天介绍卷积网络中一个很重要的概念,通道(Channel),也有叫特征 ...

  8. 卷积网络中的通道(Channel)理解

    卷积网络中的通道(Channel)理解 卷积网络中有一个很重要的概念,通道(Channel),也有叫特征图(feature map)的. 卷积网络中主要有两个操作,一个是卷积(Convolution) ...

  9. 【OpenCv】c++ 入门认识 Mat 类,单通道 Mat 的基本操作

    文章目录 前言 Mat 类 Mat 类的构造方式 Mat 基本操作 单通道 Mat 的基本操作 使用成员变量 rows 和 cols 获取矩阵的行数和列数 使用成员函数 size() 来获取矩阵的尺寸 ...

  10. 【NIO】通道Channel

    通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通 ...

最新文章

  1. 【数字信号处理】线性常系数差分方程 ( “ 线性常系数差分方程 “ 与 “ 线性时不变系统 “ 关联 | 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 线性时不变系统方法 )
  2. QT UI获得控件ID(HWND)
  3. 判断用户是否存在再进行新增_基于tableau从商业分析模型角度对业务数据进行多维度分析--【商业分析类】...
  4. mysql 有两种数据库引擎发音
  5. as安装过程中gradle_电磁阀在安装过程中需注意的一些细节
  6. 面试官:谈谈 Tomcat 架构及启动过程,我一脸懵逼。。
  7. mdt抓取镜像后只显示回收站_又涨了!废纸价格贵过废铜烂铁,回收站缩减废旧物品收购规模...
  8. [原创]Java开发如何在线打开Word文件
  9. html矩形变圆形的代码,html5canvas绘制矩形和圆形的实例代码.pdf
  10. Echarts实现“暂无数据”的几种方案
  11. Java字节码增强探秘
  12. 计算机英语中级职称题库,职称计算机考试题库(中级职称需要考计算机吗)
  13. 数字序号的级别与文章层次结构的关系
  14. 小红书html布局自适应,Flutter实现马蜂窝小红书自适应高度轮播图
  15. CREATE PROCEDURE
  16. Postgresql日期转字符串
  17. mac 用户 文件夹 权限_Mac修改账户名称和个人目录后,进不去系统怎么办?
  18. 计算机领域前沿技术总结
  19. GS1条形码为什么那么贵?有什么便宜的办法吗?
  20. 一年省下1000亿? 原来零售玩的是闷声发大财

热门文章

  1. java提高篇(八)----详解内部类
  2. jqGrid使用整理
  3. 第 16 章 反射(Reflection)
  4. OpenCV学习笔记(六)(七)(八)(九)(十)
  5. 程序员面试题精选100题(50)-树的子结构[数据结构]
  6. 基于哈希的图像检索 HABIR(HASHING BASELINE FOR IMAGE RETRIEVAL)
  7. Centos下安装FTP并进行虚拟用户访问方式配置
  8. Python3之字符串格式化format函数详解(下)
  9. [十三]JavaIO之PushBackInputStream
  10. swoole学习(一)----linux安装swoole