Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍


为什么需要channel?前面使用全局变量加锁同步来解决goroutine的通讯,但不完美

1)主线程在等待所有goroutine全部完成的时间很难确定,我们这里设置10秒,仅仅是估算。
2)如果主线程休眠时间长了,会加长等待时间,如果等待时间短了,可能还有goroutine处于工作状态,这时也会随主线程的退出而销毁
3)通过全局变量加锁同步来实现通讯,也并不利用多个协程对全局变量的读写操作。
4)上面种种分析都在呼唤一个新的通讯机制-channel

package mainimport ("fmt""sync""time"
)var (m = make(map[int]int, 10)//声明一个全局的互斥锁  lock是一个全局的互斥锁//sync是包 同步的意思 mutex是互斥的意思lock sync.Mutex
)// test函数就是计算n的阶乘
func test(n int) {res := 1for i := 1; i <= n; i++ {res = res * i}//将计算结果放到map当中 加锁lock.Lock()m[n] = reslock.Unlock()
}func main() {//这里开启多协程完成任务for i := 1; i <= 20; i++ {go test(i)}time.Sleep(time.Second * 10)for k, v := range m {fmt.Println(k, v)}
}


 

channel的介绍


1)channle本质就是一个数据结构-队列【示意图】
2)数据是先进先出
3)线程安全,多goroutine访问时,不需要加锁,就是说channel本身就是线程安全的(管道是线程安全的,你在对管道读取的时候不管有多少个协程在对同一个管道操作,可以放心使用,不会出现错误,这些是有编译器在底层维护的)
4)channel时有类型的,一个string的channel只能存放string类型数据。(如果管道想放int或者float那么可以使用空接口interface类型)
 

定义/声明channel


var变量名chan敞据类型

举例:

var intChan chan int (intChan用于存放int数据)
var mapChan chan map[int]string  (mapChan用于存放map[int]string类型)
var perChan chan Person
var perChan2 chan *Person

说明:

1)channel是引用类型

2)channel必须初始化才能写入数据,即make后才能使用

3)管道是有类型的,intChan只能写入整数int

channel初始化


说明:使用make进行初始化

var intChan chan int
intChan =make(chan int,10)

向channel中写入(存放)数据

var intChan chan int
intChan =make(chan int,10)
num =999
intChan<-10
intChan<-num

如果将channel传给另外一个函数,那么在这个函数里面操作的是同一个管道,因为它是引用类型。

package mainimport "fmt"func main() {var intChan chan int//创建可以存放3个int类型的管道intChan = make(chan int, 3)//看看intChan是什么fmt.Printf("initChan的值为=%v\ninitChan本身地址为%p\n", intChan, &intChan)//向管道写入数据intChan <- 1num := 2intChan <- num//当给管道写入数据的时候,不能超过其容量//看看管道的长度和capfmt.Println("长度:", len(intChan), "容量:", cap(intChan))num1 := <-intChanfmt.Println("取出来的第一个数据是:", num1)fmt.Println("取出之后的长度:", len(intChan), "取出之后的容量:", cap(intChan))//在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报告deadlock
}initChan的值为=0xc00007a080
initChan本身地址为0xc00000a028
长度: 2 容量: 3                    
取出来的第一个数据是: 1            
取出之后的长度: 1 取出之后的容量: 3

 

 

 

 channel使用注意事项


1.channel中只能存放指定的数据类型

2.channle的数据放满后,就不能再放入了(会出现死锁的错误)

3.如果从channel取出数据后,可以继续放入

4.在没有使用协程的情况下,如果channel数据取完了,再取,就会报dead lock

 管道里面可以存放很多map,每个map里面又可以有多对的key/value。这里在使用map之前要先make一把。

 管道也是可以存放结构体实例的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】HTTP响应报文Cookie原理

目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行&#xff1a;包含三部分&#xff1a;协议版本&#xff0c;状态码&#xff0c;状态码描述响应头&a…

如何选择LED天幕屏的型号

随着LED屏幕技术的不断成熟&#xff0c;其应用范围也日益扩大&#xff0c;从传统的墙面固定安装&#xff0c;到落地式、租赁移动式&#xff0c;再到LED互动地砖屏和安装在天花板上的LED天幕屏等&#xff0c;安装方式多种多样。那么&#xff0c;在面对如此多元化的选择时&#x…

PHP基础 - 类型比较

在 PHP 中,作为一种弱类型语言,它提供了松散比较和严格比较两种方式来比较变量的值和类型。 松散比较: 使用两个等号(==)进行比较,只会比较变量的值,而不会考虑它们的数据类型。例如: $a = 5; // 整数 $b = 5; // 字符串if ($a == $b) {echo "相等"; // 输…

C/C++ 编程规范总结

目录 前言 一、编程规范的作用 二、规范的三种形式 三、规范的内容 1. 基本原则 原则1-1 原则1-2 原则1-3 原则1-4 原则1-5 原则1-6 原则1-7 2. 布局 规则2-1-1 规则2-1-2 规则2-1-3 规则2-1-4 规则2-1-5 规则2-1-6 规则2-2-1 规则2-2-2 规则2-2-3 建议2…

简单聊聊使用lombok 的争议

大家好&#xff0c;我是G探险者。 项目里&#xff0c;因为我使用了Lombok插件&#xff0c;然后代码走查的时候被领导点名了。 我心想&#xff0c;这么好用的插件&#xff0c;为啥不推广呢&#xff0c;整天写那些烦人的setter&#xff0c;getter方法就不嫌烦么&#xff1f; 领导…

AidLux:手机/平板上的Linux环境与AI开发利器

AidLux是一个基于ARM架构的跨生态&#xff08;鸿蒙/AndroidLinux&#xff09;一站式智能物联网&#xff08;AIoT&#xff09;应用开发和部署平台&#xff0c;正受到越来越多开发者和用户的青睐。既可以作为手机/平板上的一个Linux环境使用&#xff0c;也可以作为AI开发利器以发…

Python Django Suit:构建现代化的Django后台管理

概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用&#xff0c;它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能&#xff0c;提供详实的示例代码&#xff0c;帮助大家更好地使用和定制Django后台管理界面。 安装与…

无法解除Word文档限制编辑?上干货

方法一&#xff1a;新建一个文档-点击“插入”-点击“对象”-点击选择中的倒三角-然后选择“文件中的文字”-找到相应文档即可 具体操作界面如下图这个方法会导致格式出现稍稍微的变化 方法二&#xff1a;将受编辑的文件另存为 文件类型一定要选择*.xml 另存好之后是这样的 打…

智能优化算法应用:基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.参考…

[C++] STL_priority_queue(优先级队列) 的使用及底层的模拟实现,容器适配器,deque的原理介绍

文章目录 1、priority_queue1.1 priority_queue的介绍和使用1.2 priority_queue的使用模拟实现&#xff1a; 2、容器适配器2.1 什么是适配器2.2 STL标准库中stack和queue的底层结构 3、deque3.1 deque的原理介绍3.2 deque的缺陷 4、为什么选择deque作为stack和queue的底层默认容…

docker配置连接harbor私有仓库

一、前言 以下分为两种情况说明docker对harbor私有仓库的访问配置&#xff0c;一种是harbor使用自建证书配置https&#xff0c;一种是使用公有证书配置https 二、docker配置 harbor使用自建证书的情况 使用自建证书对harbor进行https配置&#xff0c;docker会将该仓库识别成不…

SDXL使用animateDiff和hotshot-xl进行文生视频

截至2023.12.8号&#xff0c;目前市面上有两款适用于SDXL的文生视频开源工具&#xff0c;分别是AnimateDiff和hotshot-xl。 一、工具下载链接 &#xff08;1&#xff09;AnimateDiff的webui版本的git链接&#xff1a; GitHub - continue-revolution/sd-webui-animatediff: A…

Postman获取token

问题描述 登录接口中带有token参数&#xff0c;其他接口需要带上token才能正确访问&#xff0c;利用接口查询用户信息时手动在headers中更新token信息并不方便。 解决方案 在登录接口中设置一个名为“token”的环境变量&#xff0c;value为登录接口跑通之后responseBody中返回…

51单片机的独立按键与矩阵按键的使用以及实例分析

IO 的使用–按键 本文主要涉及8051单片机的按键的使用&#xff0c;包括独立按键与矩阵按键。 其中包括实例分析&#xff1a; 独立按键 K1 控制 D1 指示灯亮灭通过数码管显示矩阵按键 S1-S16 按下后键值 0-F 文章目录 IO 的使用--按键一、按键消抖二、独立按键独立按键 K1 控制 …

IAR嵌入式解决方案发布全新版本,增强云调试和仿真功能,推动下一代嵌入式软件开发

通过先进的Arm虚拟硬件集成和Linux系统中增强的基于云的协作&#xff0c;赋能下一代嵌入式软件开发 瑞典乌普萨拉&#xff0c;2023年12月7日 - 嵌入式开发软件和服务的全球领导者IAR宣布推出旗舰产品IAR Embedded Workbench for Arm及IAR Build Tools for Arm最新9.50版本。此…

vue2+datav可视化数据大屏(3)

接上一节所说&#xff0c;当我们将接口封装完了后&#xff0c;我们需要给大屏进行内容填充啦 1,新建组件 &#x1f4d3; 我们在ser-views文件夹下新建9个vue组件&#xff0c;如下图所示&#xff0c;我给编号为1到9 &#x1f4d3;在组件里写入内容我是第一块...一次类推&#x…

AOSP开机动画调测技术点(基于Android13)

AOSP开机动画调测技术点(基于Android13) 开机动画替换 首先&#xff0c;在你的计算机上创建一个名为"bootanimation"的文件夹&#xff0c;并将"part0"、"part1"和"desc.txt"这三个文件复制到该文件夹中。这些文件包含了开机动画的图像…

基于深度学习的超分辨率图像技术一览

超分辨率(Super-Resolution)即通过硬件或软件的方法提高原有图像的分辨率&#xff0c;图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题&#xff0c;在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。 SR取得了显著进步。一般可以将现有…

小机器人,电子锁,牙刷,表类开关,磁阀开关等一些安防直流驱动的选型介绍分析 5V,大电流,小封装

安防监控是一门被人们日益重视的新兴行业&#xff0c;就目前发展来看&#xff0c;应用普及程度越来越广&#xff0c;科技含量也越来越高&#xff0c;几乎所有高新科技都可促进其发展&#xff0c;尤其是信息时代的来临&#xff0c;更为该行业的发展提供契机。其中安防领域最为典…

【力扣】刷题备忘录-动归-62. 不同路径

62. 不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));// 2D vector的标准写法 有些麻烦for (int i 0; i < m; i) dp[i][0] 1; // 又忘记写&#xff1b;了。。。for (int j 0; j < …