Go | 一分钟掌握Go | 9 - 通道

作者:Mars酱

声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。

转载:欢迎转载,转载前先请联系我!

前言

在Java中,多线程之间的通信方式有哪些?记得吗?Java多线程间通信的解决方案有很多种,比如:synchronized。使用锁来防止资源乱来,一人一个按顺序来,要么使用JDK提供的原子对象,那些Atomic关键字开头的对象,比如:AtomicInteger,这样可以在多个线程中读写值的时候保证是安全的,还有很多其他的方式,在go中,就一种:通道

通道

go的通道我根据java的理解,它就是用来解决线程之间通信的东西,go里面的关键字叫channels

以下是搜索出来的解释:

go语言提倡使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。这里通信的方法就是使用通道(channel),如下图所示:

图:goroutine 与 channel 的通信

是不是和java的线程安全对象是类似?或者说是队列?总之你可以按照你自己经验去理解。

如何创建通道

go提供了创建通道的语法:

通道变量名 := make(chan 数据类型)

比如,我们可以这样写:

// 创建一个int型的通道
ch1 := make(chan int)

还可以创建一个接口类型通道,比如:

ch2 := make(chan interface{})

还能创建一个结构体的通道,比如:

// 创建一个User结构体的通道,这个通道是个指针通道
ch3 := make(chan *User)

向通道发送数据

go向通道发送数据语法非常简单:

通道变量名 <-

我们向上面三个通道名发送数据,可以写成:

// 1. 给ch1通道传值0
ch1 <- 0
// 2. 给ch2通道传字符串,实际可以穿任意对象,因为前面声明了是interface对象
ch2 <- "hello, mars酱"

// 创建一个userInfo结构体并初始化值
userInfo := User{
	1, "mars酱",
}
// 3. 发送一个结构体到通道ch3中
ch3 <- &userInfo

以上代码是无法运行的,因为go的通道有个规矩,发送和接收必须成对出现,不信邪的可以验证一下。

从通道接收数据

go从通道中接收数据的语法也简单:

data := <- ch1

这个语句是个阻塞语句,只有当data接收到了值,才会执行后续的,非阻塞的这样写:

data, ok := <- ch1

data:接收的数据,如果没有接收到,data为0。data为0取决于之前make通道的时候,ch1是个int型通道,如果是其他类型,这个data也应该是其他类型对象;

ok:boolean类型的值,表示是否接收到数据

还有个奇葩的写法:

<- ch1

这样写就表示通道里有啥都与我无关,忽略掉了。

通道的例子

一个倒数的例子,通过通道去实现一下:

// author: mars酱
func Test_chanTest(t *testing.T) {
	// 1. 创建一个通道
	ch1 := make(chan int)
	// 2. 启动goroutine并发
	go func() {
		// 从5 到 0
		for i := 5; i >= 0; i-- {
			// 3. 发送给通道
			ch1 <- i
			// 发完后等1秒
			time.Sleep(time.Second)
		}
	}()
	// 4. 循环接收通道数据
	for data := range ch1 {
		fmt.Println(data)
		if data == 0 {
			break
		}
	}
}

运行的结果:

发射火箭的倒数计时就是这样吧~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云计算•云原生】3.一小时熟练掌握docker容器

文章目录 docker简介ubuntu下安装dockerkali下安装dockerdocker基本命令docker搭建mysql、nginx、redis容器/镜像打包搭建私有镜像仓库docker网络管理Dockerfile文件docker-compose.yml示例&#xff1a;搭建lamp docker简介 docker是一个开源的应用容器引擎&#xff0c;可以让…

缓存优化----SpringCache

spring cache spring Cache介绍 spring cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring cache提供了一层抽象&#xff0c;底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不…

解决方案丨票据集中在集团总部处理,如何解决实物票据管理难?

目前越来越多的企业都成立了财务共享中心&#xff0c;通过统一财务中心可以进行集中式、标准化、统一化管理&#xff0c;提升财务运营水平与效率、降低企业的整体运作成本、集团战略发展支撑。 如何确保财务共享中心稳健和高效运营&#xff0c;是很多企业建立共享中心后面的难…

7.参数校验

在controller和service进行前端传参校验&#xff0c;保证存到数据库的数据是正确的 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>这里无需…

《程序员面试金典(第6版)》面试题 16.05. 阶乘尾数

题目描述 设计一个算法&#xff0c;算出 n 阶乘有多少个尾随零。 示例 1: 输入: 3输出: 0解释: 3! 6, 尾数中没有零。 示例 2: 输入: 5输出: 1解释: 5! 120, 尾数中有 1 个零 说明: 你算法的时间复杂度应为 O(log n) 。 解题思路与代码 这道题&#xff0c;乍一看很简单…

米哈游新游正式公测!还没上线就已经“爆了”!

米哈游制作的3D冒险主题回合制策略游戏《崩坏&#xff1a;星穹铁道》&#xff0c;在2023年4月26日正式开启全平台公测。 该游戏在2021年10月27日曾开启过“始发测试”&#xff0c;后继续沉淀了两年才正式开启公测。 B站的ACG内容生态丰富&#xff0c;其中游戏相关内容当数米哈…

锂溶液净化和提纯

锂离子电池是一种充电电池&#xff0c;依靠锂离子在正极和负极之间移动来工作&#xff0c;广泛应用在便携式设备、卫星、储备电源、电动汽车等领域&#xff0c;具有替代各种二次电源的潜力。 近年来国家大力提倡和发展的新能源产业&#xff0c;锂离子电池的需求量的不断攀升&a…

聊聊「低代码」的实践之路

区块链、低代码、元宇宙、AI智能&#xff1b; 01 【先来说说背景】 这个概念由来已久&#xff0c;但是在国内兴起&#xff0c;是最近几年&#xff1b; 低代码即「Low-Code」&#xff1b; 指提供可视化开发环境&#xff0c;可以用来创建和管理软件应用&#xff1b; 简单的说…

Apache Zeppelin系列教程第一篇——安装和使用

一、Apache Zeppelin 介绍 Apache Zeppelin是一种开源的Web笔记本类型交互式数据分析工具&#xff0c;它提供了基于浏览器的界面&#xff0c;允许数据工程师和科学家通过各种语言和工具&#xff0c;如Scala, Python, SQL, R,等等&#xff0c;交互式地进行数据分析、可视化以及…

成功解决长时间挂起虚拟机后再次打开无法连接网络,并提示网络激活失败(亲测有效)

成功解决长时间挂起虚拟机后再次打开无法连接网络&#xff0c;并提示网络激活失败&#xff08;亲测有效&#xff01;&#xff09; 之前做区块链的一个虚拟机很久没打开&#xff0c;一直处于挂起状态&#xff0c;一直提示网络连接激活失败。试了很多种方法没解决&#xff0c;更…

如何设置ddns动态域名实现内网发布外网

在本地搭建好服务器&#xff0c;部署好web网站或其他应用后&#xff0c;需要设置动态域名服务ddns&#xff0c;将主机的内网IP端口映射到外网访问&#xff0c;才能实现在外网访问内网。今天小编就和大家分享一下内网发布外网方案&#xff0c;即如何设置ddns动态域名服务实现外网…

【hello Linux】可重入函数、volatile和SIGCHLD信号

目录 1. 可重入函数 2. volatile 3. SIGCHLD信号 Linux&#xff01;&#x1f337; 1. 可重入函数 先来谈一下重入函数的概念&#xff1a;重入函数便是在该函数还没有执行完毕便重复进入该函数&#xff08;一般发生在多线程中&#xff09;&#xff1b; 可重入函数&#xff1a…

【私有云底层】理解OpenStack核心组件

文章目录 &#x1f479; 关于作者一、Keystone 身份认证服务Keystone 架构工作流程 二、Glance 镜像服务Glance 架构磁盘与容器Glance 工作流程 三、Placement 放置服务Placement 工作流程 四、Nova 计算服务Nova 架构Nova 工作流程 五、Neutron 网络服务Neutron 架构Neutron 支…

浅谈测试用例设计 | 京东云技术团队

作者&#xff1a;京东物流 王莹莹 一、测试用例为什么存在 1.1 定义 测试用例(Test Case)是指对特定的软件产品进行测试任务的描述&#xff0c;体现测试方案、方法、技术和策略。测试用例内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等&#xff0c;…

FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真

创建一个FreeRTOS系统工程 1.新建工程文件夹2.Keil新建工程2.1 New Project2.2 Select Device For Target2.3 Manage Run-Time Environment 3. 在 KEIL 工程里面新建文件组3.1在 KEIL 工程里面添加文件 4. 编写 main 函数5. 调试配置5.1 设置软件仿真5.2 修改时钟大小在时钟相关…

基于python的socket网络通信【1】

一、Socket原理 学习了大佬的知识&#xff0c;简单记一些笔记 https://www.jianshu.com/p/066d99da7cbd http://c.biancheng.net/view/2351.html 1.1什么是Socket 在计算机通信领域&#xff0c;socket 被翻译为“套接字”&#xff0c;它是计算机之间进行通信的一种约定或一种…

计算机网路常见面试题(上)

计算机网络基础 # 网络分层模型 # OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f; OSI 七层模型 是国际标准化组织提出一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都…

网络安全:namp扫描工具

-sP可以扫描一个网段ip以及状态和基本信息&#xff0c;10.1.1.2-3就是扫描2和3这两个ip的主机 -p可以扫描指定ip对应主机的端口号&#xff0c;可以是一个范围 nmap简单扫描&#xff1a;nmap 地址 检查地址是否在线以及open的端口号 在端口开放&#xff0c;不一定可以与对方正常…

Spring 依赖注入源码

文章目录 依赖注入原始依赖注入方式注解方式寻找注入点注入点进行注入 从BeanFactory中找注入对象总结 依赖注入 具体代码是在AbstractAutowireCapableBeanFactory类的populateBean()方法&#xff0c;此方法中主要做的事情如下&#xff1a; 实例化之后&#xff0c;调用Instan…

各大外卖平台占据共享经济市场主要份额,占比近50%

哈喽大家好&#xff0c;随着大量互联网用户和移动支付的普及、大量用户通过共享平台将闲置资源和服务与需求方进行匹配&#xff0c;实现了资源的高效利用和消费者福利的提升。在全球化驱动的新型消费需求以及政策支持下&#xff0c;共享经济正在向更加成熟和规范化的方向发展。…