当前位置: 首页 > news >正文

Go中 channel的使用

文章目录

    • 背景
    • channel 简介
    • 使用说明
      • 声明
      • 发送和接受数据
      • 关闭channel
    • 使用示例

背景

使用 sync 包和 context 包的工具可以实现多个协程之间互相协作, 但是没有一种很好的方式解决多个协程之间通信的问题. golang 作者 Rob Pike 说过一句话,不要通过共享内存来通信,而应该通过通信来共享内存. 表示了Go中不希望通过共享区域存储数据来实现多个协程的通信.

channel 简介

可以把channel 看作 是一种先进先出的双向队列, 并且是并发安全,同一时刻,运行时只会执行一个对同一 channel 操作(发送或接收)中的某一个操作(发送或接收),即操作(发送或接收)之间是互斥的。并且对同一 channel 中的同一个元素执行的发送和接收操作之间也是互斥的。

使用说明

声明

生命使用 make 函数, 第一个参数必须是chan 数据类型 第二个可选的int 类型, 如果没有给定第二个参数,该 channel 为无缓冲 channel, 即 默认为0。反之为有缓冲 channel。参数表示缓冲区的大小, 即除了被等待读取的数据外, 还可以存储的容量, 那么队列总长度, 就是第二个参数 + 1.

// 声明一个 int 类型的无缓冲 channel
c1 := make(chan int)
// 声明一个 int 类型的有缓冲 channel,容量 cap 为 5, 队列可以存储 6 个数据
c2 := make(chan int, 5)

单向 channel 创建, 默认创建的 channel 是双向的, 即双方都可以写入和写出, 单项写入channel 是 chan<- int 单向输出 channel 是 <-chan int

发送和接受数据

发送和接受数据都使用 <- 区别是,发送时操作符在 channel 类型变量名的右边,接收时操作符在 channel 类型变量的左边。

c := make(chan int, 2)
// send
c <- 1
c <- 2
// 接受并且输出结果
fmt.Println(<- c)
// 接收并且赋值给变量
x <- c

关闭channel

使用close(chan变量) 方法的方式关闭 channel, 在读取的时候, 第二个参数可以表示是否关闭了 channel, 为 true 就表示 channel 没有关闭

c := make(chan int, 5)
close(c)
val, ok := <- c
// ok为true 就表示还没有关闭
fmt.Println(val, ok)

使用示例

我们要听从老板的指示, 老板让做啥就做啥, 我们这里使用单向的队列实现, 老板发送信息, 员工接收信息.

package mainimport ("fmt""time"
)var c = make(chan string,2)// 返回只能写入的类型
func getSender() chan<- string {return c
}
// 返回只能读取的类型
func getRec() <-chan string {return c
}// 并发执行任务 1 和任务 2
func main() {// 小卡拉准备接活干rec := getRec()go func() {for i := range rec {fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "小卡拉开始干", i)time.Sleep(2 * time.Second)fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "小卡拉干完了", i)}}()// 老板派活send := getSender()arr := [...]string{"拿快递", "点外卖", "泡咖啡", "写PPT", "写总结"}for _, data := range arr {fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "老板安排", data)send <- data}close(send)time.Sleep(15* time.Second)
}

如上所示,我们创建可一个缓存区长度为2 的有缓存channel, 之后先启动一个员工的协程, 等待处理数据, 后面老板开始往队列写入摇杆的活. 执行结果如下
在这里插入图片描述
可以看待, 老板发布了三个任务就不能继续发布了, 必须等待员工取走一个才行, 这里表明第一个是等待接受的数据, 后面两个是缓存区的数据, 对应缓存区大小为2. 再往后就是员工取一个, 老板发布一个. 这样就完成了两个协程的通信

还有老板的协程和员工的协程分别从getSendergetRec拿到的只能写入的和只能读取的channel. 我们试试往只能读取的channel 写入会发生什么呢? 比如员工要反馈, 不想干了.
在这里插入图片描述
在这里插入图片描述

会发现直接编译错误.

相关文章:

Go中 channel的使用

文章目录背景channel 简介使用说明声明发送和接受数据关闭channel使用示例背景 使用 sync 包和 context 包的工具可以实现多个协程之间互相协作, 但是没有一种很好的方式解决多个协程之间通信的问题. golang 作者 Rob Pike 说过一句话&#xff0c;不要通过共享内存来通信&…...

【C++】string OJ练习

文章目录1. 仅仅反转字母思路分析代码实现2. 字符串中的第一个唯一字符题目分析代码实现3. 《剑指offer》——替换空格解法一&#xff1a;寻找替换思路分析代码实现优化解法二&#xff1a;空间换时间思路分析代码实现4.字符串最后一个单词的长度思路分析代码实现5. 字符串相加思…...

进程间通信IPC

进程间通信IPC (InterProcess Communication) 一、进程间通信的概念 每个进程各自有不同的用户地址空间&#xff0c;任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲区&#xff0c;进程1把数据…...

操作系统-页面淘汰算法(下)-软件设计(二十六)

操作系统-PV操作&#xff08;上&#xff09;-软件设计&#xff08;二十五&#xff09;https://blog.csdn.net/ke1ying/article/details/129476031 存储管理-分区存储组织 问&#xff1a;计算机系统内存大小为128k&#xff0c;当前系统分配情况如图&#xff0c;那么作业4再次申…...

23种设计模式-责任链模式(Android开发实际应用场景介绍)

什么是责任链模式 责任链模式是一种行为型设计模式&#xff0c;它的核心思想是将请求从一系列处理者中传递&#xff0c;直到其中一个处理者能够处理它为止。在这个过程中&#xff0c;请求可以被任何一个处理者处理&#xff0c;也可以被拒绝&#xff0c;直到有一个处理者能够处…...

Socket+Select+Epoll笔记

讲到epoll&#xff0c;就必须了解Socket&#xff0c;上篇博客写了Socket的基本使用方法&#xff0c;步骤主要为创建一个socketsocket是进程之间通信的&#xff0c;那么进程通信如何找到这个socket呢&#xff1f;当然是端口号&#xff0c;所以socket就要和端口号进行绑定&#x…...

git查看最近修改的文件

git log --name-status 每次修改的文件列表, 显示状态 git log --name-only 每次修改的文件列表 git log --stat 每次修改的文件列表, 及文件修改的统计 git whatchanged 每次修改的文件列表 git whatchanged --stat 每次修改的文件列表, 及文件修改的统计 git show 显示最…...

【算法基础(四)】堆排序(二)

堆排序&#xff08;二&#xff09; 把数组从零开始连续的一段 完全二叉树 size i 左 son 2*11 i 右 son 2*12 父 (i-1) / 2 堆是完全二叉树&#xff0c;分为大根堆和小根堆 在完全二叉树里&#xff0c;每一棵子数最大的值是头节点的值&#xff0c;就是大根堆 同理&…...

C++类型转换

C语言的转换是在变量前加类型名进行转换的&#xff0c;比如double pi 3.14;int a (int) pi;对于指针也是如此double* dptr &pi;int* iptr (int*)dptr;虽然c兼容了C语言的转型方式&#xff0c;但是也做了很多限制&#xff0c;比如向上类型转换&#xff0c;在c中建议使用…...

Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)

注&#xff1a;这个是MDK6&#xff0c;不是MDK5 AC6&#xff0c;属于下一代MDK视频版&#xff1a; https://www.bilibili.com/video/BV16s4y157WF Keil MDK6要来了&#xff0c;将嵌入式软件开发水平带到新高度&#xff0c;支持跨平台一年一度的全球顶级嵌入式会展Embedded Wor…...

蓝桥杯刷题第九天

题目描述本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。素数就是不能再进行等分的整数。比如7&#xff0c;11。而 9 不是素数&#xff0c;因为它可以平分为 3 等份。一般认为最小的素数是2&#xff0c;接着是 3&#xff0c;5&…...

a-tree-select 基本使用,下拉框高度和宽度设置、回显时滚动条定位解决。

目录一、基本使用1. 界面效果2. 代码实现3. 问题1&#xff1a;下拉框占满整个屏幕4. 问题4&#xff1a;菜单内容过长时&#xff0c;下拉菜单宽度无限变宽。二、数据回显、滚动条定位1. 界面效果2. 代码实现2.1 获取默认展开节点2.1.1 代码实现2.1.2 说明2.2 设置滚动条定位2.2.…...

【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录nc命令简介nc命令的安装nc命令语法格式…...

cdn简单配置

cdn配置域名接入CDN编辑CDN配置本地修改hosts文件&#xff0c;绕过公网解析域名接入CDN 添加CDN域名以及回源配置 编辑CDN配置 默认后端端口是80&#xff0c;如果测试发现无法访问&#xff0c;则可能是443或其它 如果域名在CDN后端有https强制跳转&#xff0c;后端端口一定是44…...

前端安全(自留)

目录XSS——跨站脚本常见解决CSRF ——跨站请求伪造常见解决XSS——跨站脚本 当目标站点在渲染html的过程中&#xff0c;遇到陌生的脚本指令执行。 攻击者通过在网站注入恶意脚本&#xff0c;使之在用户的浏览器上运行&#xff0c;从而盗取用户的信息如 cookie 等。 常见 解…...

零基础转行云计算可行吗

目前处于云年代&#xff0c;云计算运维工程师的工作远景还是十分广泛的。像是阿里云计算&#xff0c;滴滴&#xff0c;抖音等等互联网大厂目前都在使用云核算技能。 云计算运维工程师的薪资水平也十分可观。 运维工程师(Operations)&#xff0c;在国内又称为运维开发工程师(Dev…...

【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)

目录 写在前面&#xff1a; 题目&#xff1a;92. 递归实现指数型枚举 - AcWing题库 读题&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 数据范围&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &…...

孩子免费就读|私企经理自费赴美国东海岸高校访学

私企U经理无文章无课题&#xff0c;出国访学除了为考察市场、拓宽人脉、提升履资外&#xff0c;另一个主要目的是带孩子在美国接受当地免费的公立中小学教育&#xff0c;并把访学目标学校定位在东海岸。最终其采纳了板凳费相对较低的佐治亚大学邀请函&#xff0c;签证时居然全家…...

前端面试hr经常会问的问题

文章目录前言1.自我介绍2.为什么你要离职&#xff1f;3.工作经历4.职业规划5.优点、缺点6.还有什么要问的总结前言 这里记录了一些面试中hr或者项目负责人经常会问的一些问题&#xff0c;可以提前参考参考&#xff0c;想想该怎么回答&#xff0c;为之后的面试做好准备&#xf…...

C动态数组

在实际项目中&#xff0c;我们经常与各式各样的数据打交道。 例如&#xff1a;我们处理的是学生的数据。 struct student {int id; // 学号char name[20]; // 姓名int gender; // 性别int mark; // 成绩 };学生数据使用一个结构体表示&#xff0c;该结构体拥有4个成员。分别为…...

【STL一】STL组件(容器、迭代器、算法)

【STL一】STL组件&#xff08;容器、迭代器、算法&#xff09;一、STL二、STL组件&#xff08;component&#xff09;1、stl六大组件2、C STL的13个头文件3、stl所有头文件三、容器&#xff08;container)1、序列容器&#xff08;Sequence container)——顺序容器2、关联容器&a…...

Java每日一练(20230312)

目录 1. 两数之和 II ★ 2. 反转链表 ★★ 3. 二叉树的层序遍历 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 两数之和 II 给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数…...

Linux中sudo,su与su -命令的区别

前言 su命令就是切换用户的工具&#xff0c;怎么理解呢&#xff1f;比如我们以普通用户tom登录的&#xff0c;但要添加用户任务&#xff0c;执行useradd &#xff0c;tom用户没有这个权限&#xff0c;而这个权限恰恰由root所拥有。解决办法无法有两个&#xff0c;一是退出tom用…...

归并排序有多简单?一幅图教你看懂【C语言】

目录 归并排序的递归实现 代码实现 归并排序的非递归实现 代码实现 归并排序的思想很简单——分治法。简单地说&#xff0c;归并排序的是将序列拆分成几段子序列&#xff0c;将每一段子序列分别进行排序&#xff0c;排好之后再将有序的子序列归并&#xff08;有点像合并两…...

C++-Z字扫描实现(Zigzag Scan)

Z字扫描(Zigzag Scan) 将二维矩阵压缩成行输出&#xff1a; int index0; for(int i0;i<rowscols-1;i){//i是第几条对角线if(i&1){//odd,向下扫描for(int jmax(0,i-cols1);j<min(i,row-1);j){res[index]mtx[j][i-j];}//}else{//偶数&#xff0c;向上扫描for(int jmi…...

【华为机试真题详解 Python实现】求最大数字【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1示例 2题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即…...

面对数万亿产业规模,如何掘金工业互联网?

近年来&#xff0c;加速工业互联网建设的声音越来越响亮。一方面&#xff0c;政策利好&#xff0c;持续驱动。从2017年的《国务院关于深化“互联网先进制造业” 发展工业互联网的指导意见》到《工业互联网创新发展三年行动计划&#xff08;2021-2023年&#xff09;》&#xff0…...

#ifdefine #define #endif (避免头文件被重复包含的真正含义)

宏定义 首先在谈论正式话题之前&#xff0c;需要先介绍一个基础概念&#xff0c;也是前提&#xff0c;那就是宏定义。 #define demo 1 #define PI 3.14我们都知道这样会将demo 在预处理阶段替换或者说展开为1&#xff0c;Pi 替换为3.14。 #define 宏定义一个标识符来表示一个…...

单片机能运行操作系统吗?

先直接上答案&#xff1a;可以&#xff01;但是操作系统不是刚需&#xff0c;上操作系统比较占用单片机的资源&#xff0c;比如占用比较多的FLASH和RAM&#xff0c;间接增加了硬件成本&#xff0c;哪怕成本增加1毛钱&#xff0c;对于上量的产品&#xff0c;分分钟是一个工程师的…...

Python之webmagic爬虫优点与使用

一、webmagic的优点它更偏向于java的语法&#xff0c;对于熟悉java的工程师来说学习成本较低。提供多种选择器&#xff0c;如css选择器、xpath、正则等。有一个模块pipeline&#xff1a;可通过简单地配置&#xff0c;可以将爬虫抽取到的信息&#xff0c;持久化到文件、数据库等…...

网站 设计风格/神马推广登录

一、JVM管理内存段分类 1、线程共享内存 方法区&#xff1a;存储jvm加载的class、常量、静态变量、及时编译器编译后的代码等 java堆&#xff1a;存储java所有对象实例、数组等 2、线程私有内存 程序计数寄存器&#xff1a;每个线程有自己的计数寄存器&#xff0c;存储当前线程…...

做网站开发的笔记本配置/平台优化

string &#xff1a;关键字 String &#xff1a;类 可以认为string 是String的别名&#xff0c;在生成的IL中&#xff0c;都是当做String&#xff0c;类似的还有 object 与Object&#xff0c;int 与 Int32 转载于:https://www.cnblogs.com/nzbbody/archive/2012/01/06/2314170.…...

上海免费注册公司官网/搜索引擎网站排名优化方案

尽管广泛阅读了JDK源代码并检查了内在例程,但我还是不能一概而论.我正在测试清除使用ByteBuffer.putLong(int index,long value)用allocateDirect分配的ByteBuffer.基于JDK代码,如果缓冲区为“本机字节顺序”,则将导致单个8字节的写操作&#xff1b;如果不按字节交换,则将导致相…...

php网站开发师条件/重庆人力资源和社会保障网官网

Akaxin是一款开源免费的私有聊天软件&#xff0c;可以部署在任意服务器上&#xff0c;搭建自己的聊天服务器&#xff0c;供自己与朋友、用户使用。githubhttps://github.com/daychat/openzaly特性&#xff1a;单聊、群聊(含文字、图片、语音等)端到端的加密消息(服务端不可解密…...

wordpress jitpecj插件/怎么根据视频链接找到网址

2021 年 9 月 29 日 Stephan Ewen ( StephanEwen ) 和 Johannes Moser ( joemoeAT ) Apache 软件基金会最近发布了年度报告&#xff0c;Apache Flink 再次跻身最活跃项目前 5 名&#xff01;这一非凡的活动也体现在新的 1.14.0 版本中。200 多名贡献者再次致力于解决 1,000 多…...

农村室内设计效果图/宁波seo关键词排名

苹果公布的业绩显示三季度它在大中华区的销售额同比下滑了28.5%&#xff0c;有分析认为这主要是因为中国手机企业抢走了它的市场&#xff0c;实际情况真的如此么&#xff1f;据市调机构Canalys公布的今年三季度中国智能手机市场的数据&#xff0c;苹果的出货量同比下滑1%&#…...