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

news2025/2/4 19:37:28

channel(管道)-基本介绍


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

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

package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	m = make(map[int]int, 10)
	//声明一个全局的互斥锁  lock是一个全局的互斥锁
	//sync是包 同步的意思 mutex是互斥的意思
	lock sync.Mutex
)

// test函数就是计算n的阶乘
func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res = res * i
	}
	//将计算结果放到map当中 加锁
	lock.Lock()
	m[n] = res
	lock.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 main

import "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 <- 1
	num := 2
	intChan <- num
	//当给管道写入数据的时候,不能超过其容量
	//看看管道的长度和cap
	fmt.Println("长度:", len(intChan), "容量:", cap(intChan))

	num1 := <-intChan
	fmt.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.coloradmin.cn/o/1299921.html

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

相关文章

tgf - 一个开箱即用的golang游戏服务器框架

tgf框架 tgf框架是使用golang开发的一套游戏分布式框架.属于开箱即用的项目框架,目前适用于中小型团队,独立开发者,快速开发使用.框架提供了一整套开发工具,并且定义了模块开发规范.开发者只需要关注业务逻辑即可,无需关心用户并发和节点状态等复杂情况. 使用介绍 创建业务逻辑…

m1通过源码编译xgboost4j的jar

1、下载源码 git clone --recursive https://github.com/dmlc/xgboost cd xgboost 编译xgboost的动态链接库dylib&#xff0c;m1源码编译xgboost的动态链接库dylib文件 2、编译XGBoost的jar文件&#xff1a; A、如果没有安装maven可以通过以下命令进行安装&#xff0c;如果安…

邮件营销软件:10个创新邮件营销策略,提升投资回报率(一)

电子商务和电子邮件营销密不可分。尽管电子商务在蓬勃发展&#xff0c;而很多人对邮件营销颇有微词。但是在电子商务中&#xff0c;邮件营销的确是一种有效营销方式。在本文中&#xff0c;我们将讨论一下邮件营销在电子商务中的有效运用&#xff0c;帮助您的企业在今年尽可能地…

045:Vue读取本地上传JSON文件,导出JSON文件方法

第045个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

HibernateJPA快速搭建

1. 先创建一个普通Maven工程&#xff0c;导入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depe…

windows 10多用户同时远程登陆配置【笔记】

系统环境&多用户访问情况&#xff1a; 1、【win】【R】键入【gpedit.msc】 2、依次选择【计算机配置】→ 【管理模板】 → 【Windows组件】 → 【远程桌面服务】 → 【远程桌面会话主机】 →【连接】 2.1、右键 【允许用户通过使用远程桌面服务进行远程连接】 编辑 …

Go语言基础知识学习(一)

Go基本数据类型 bool bool型值可以为true或者false,例子&#xff1a; var b bool true数值型 类型表示范围int8有符号8位整型-128 ~ 127int16有符号16位整型-32768 ~ 32767int32有符号32位整型-2147783648 ~ 2147483647int64有符号64位整型uint8无符号8位整型0 ~ 255uint16…

linux通过命令切换用户

在Linux中&#xff0c;你可以使用su&#xff08;substitute user或switch user&#xff09;命令来切换用户。这个命令允许你临时或永久地以另一个用户的身份运行命令。以下是基本的用法&#xff1a; 基本切换到另一个用户&#xff08;需要密码&#xff09;&#xff1a;su [用户…

C# 静态构造函数与类的初始化

静态构造函数&#xff1a; 基本概念&#xff1a; 静态构造函数用于初始化任何静态数据。 静态构造函数的常见特性&#xff1a; 静态构造函数不使用访问修饰符或不具有参数。因为静态构造函数由系统调用&#xff0c;无法人为调用&#xff0c;所以就不存在public、private等。…

Gazebo 跟踪8字形和U形轨迹(1) — 错误处理

Gazebo 跟踪8字形和U形轨迹(1) — 错误处理 整个过程还是比较曲折的&#xff0c;主要都是一些细小的问题&#xff0c;跑了很多遍模型才发现 参考轨迹生成问题不大&#xff0c;主要是参考横摆角和参考曲率部分有问题 atan和atan2 首先看下两者的区别 atan 函数&#xff1a;…

智能监控型电源老化房方案

电源适配器专用老化房主要适用于充电器等电源成品&#xff08;半成品&#xff09;作一般性老化测试。其负载主体采用程控式电子负载&#xff0c;保证其稳定度和可调节性。该老化车配备电脑操作监控系统。 模拟量采集/老化房采集软件 一、老化房功能&#xff1a; 1 负载主体&am…

32.768KHz时钟RTC晶振精度PPM值及频差计算

一个数字电路就像一所城市的交通&#xff0c;晶振的作用就是十字路口的信号灯&#xff0c;因此晶振的品质及其电路应用尤其关键。数字电路又像生命体&#xff0c;它的运行就像人身体里的血液流通&#xff0c;它不是由单一的某个器件或器件单元构成&#xff0c;而是由多个器件及…

xtts和ogg不选择?

不选择ogg的理由&#xff1a; 1.需要在源端创建用户赋权&#xff0c;启用数据库最小日志&#xff0c;附加日志等操作--对生产影响较大 2.外键约束过多&#xff0c;割接启用可能很慢https://www.modb.pro/db/201126--割接停机时间影响 3.初始化配置expdp导出可能快照过旧&#x…

11.光线追踪

1.为什么要引入光线追踪 光栅化阶段有些全局效果做的并不好&#xff0c;首先不太好做软阴影&#xff0c;然后是类镜面反射&#xff0c;表面很光滑但是又达不到镜面反射那么光滑&#xff0c;光线反射到这类物体上之后会经过好几次反射&#xff0c;其次是间接光照&#xff0c;光…

File has been changed outside the editor, reload?

编译keil工程&#xff0c;一直提示&#xff1a;该文件在编译器之外被修改&#xff0c;是否重新加载。 解决办法&#xff1a; 关闭.map后缀的文件即可&#xff0c;然后重新build/rebulid可以发现不会重新弹出该错误。

数据集成和人工智能驱动的见解

数字时代使数据成为人们关注的焦点&#xff0c;将其从单纯的二进制序列转变为有价值的组织资产。随着企业越来越多地转向数据驱动战略&#xff0c;数据管理的复杂性也随之增加。当前的任务不仅仅是存储甚至收集数据&#xff0c;而是将其转化为可操作的情报。本博客旨在剖析寻求…

【漏洞复现】华脉智联指挥调度平台命令执行漏洞

Nx01 产品简介 深圳市华脉智联科技有限公司&#xff0c;融合通信系统将公网集群系统、专网宽带集群系统、不同制式、不同频段的短波/超短波对讲、模拟/数字集群系统、办公电话系统、广播系统、集群单兵视频、视频监控系统、视频会议系统等融为一体&#xff0c;集成了专业的有线…

Weblogic-wls-wsat-unserialize_CVE-2017-10271

文章目录 Weblogic < 10.3.6 wls-wsat XMLDecoder 反序列化漏洞1. 漏洞描述2. 漏洞复现2.1 环境启动2.2 漏洞扫描2.3 漏洞验证 3. 修复建议 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 1. 漏洞描述 说明内容漏洞编号CVE-2017-10271漏洞名称Weblogic <…

【牛牛送书 | 第三期】《一本书讲透Java线程:原理与实践》带你深入JAVA多线程

目录 摘要&#xff1a; 多线程对于Java的意义 为什么Java工程师必须掌握多线程 Java多线程使用方式 如何学好Java多线程 参与方式&#x1f947; 摘要&#xff1a; 互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#x…

10--面向对象OOP--05

1、代码块 如果成员变量想要初始化的值不是一个硬编码的常量值&#xff0c;而是需要通过复杂的计算或读取文件、或读取运行环境信息等方式才能获取的一些值&#xff0c;该怎么办呢&#xff1f;此时&#xff0c;可以考虑代码块&#xff08;或初始化块&#xff09;。 代码块(或…