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

news2024/12/28 4:04:29

作者: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
		}
	}
}

运行的结果:

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

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

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

相关文章

浪潮之巅 OpenAI有可能是历史上第一个10万亿美元的公司

淘金时代很像 如果你那个时候去加州淘金&#xff0c;一大堆人会死掉&#xff0c;但是卖勺子的人、卖铲子的人永远可以赚钱。所谓的shove and pick business。 大模型是平台型机会。按照我们几天的判断&#xff0c;以模型为先的平台&#xff0c;将比以信息为先的平台体量更大。…

带你深入学习k8s--(四) 控制器(k8s核心)

目录 一、概念 1、什么是控制器 2、控制器执行流程 3、控制器类型 二、控制器的使用 1、ReplicaSet 2、Deployment 1、版本迭代 2、回滚 3、修改滚动更新策略 4、暂停与恢复 3、daemonset 4、job 5、cronjob 前言&#xff1a; 上一章我们说到&#xff0c;pod有…

C++——入门基础知识

0.关注博主有更多知识 C知识合集 目录 1.命名空间 1.1命名空间的定义 1.2命名空间的使用 1.3命名空间定义的补充 2.输入与输出 3.缺省参数 3.1全缺省参数 3.2半缺省参数 3.3缺省参数的补充 4.函数重载 4.1C为什么支持函数重载&#xff1f; &#xff15;.引用 5.…

Wine运行器3.2.1——Windows虚拟机模块支持非X86架构

不写太多啥了&#xff0c;详细介绍看这里就行&#xff1a;https://bbs.deepin.org/post/248098 更新内容 ※1、Windows 虚拟机安装工具支持非 X86 架构&#xff1b; ※2、应用打包器可以与星火应用商店配合构建 arm/all 全架构的 Wine 包&#xff1b; ※3、Windows 虚拟机安装…

【MATLAB图像处理实用案例详解(12)】——基于纹理特征的指纹识别方法

目录 一、指纹图像预处理1.1 图像对比度增强1.2 图像二值化1.3 图像滤波 二、指纹图像特征提取 指纹识别系统主要涉及4个步骤&#xff1a;指纹图像采集、图像预处理、特征提取、特征匹配。一开始&#xff0c;通过指纹读取设备取得图像&#xff0c;并对原始图像进行初步处理&…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 2 MapReduce and the New Software Stack Computing cluster means large collections of commodity hardware, including conventional processors (“compute nodes”) connected by Ethernet …

学习HCIP的day.03

目录 OSPF&#xff1a;开放式最短路径优先协议 OSPF的数据包 -- 5种 OSPF的状态机 OSPF的工作过程 OSPF的基础配置 关于OSPF协议从邻居建立成为邻接的条件 OSPF的接口网络类型 OSPF&#xff1a;开放式最短路径优先协议 无类别链路状态型IGP协议&#xff1b;由于其基于拓…

golang Gin实现websocket

golang使用 Gin实现 websocket&#xff0c;这里笔者重新搭建一个项目 1、创建项目安装依赖 项目名为 go-gin-websocket 在指定文件夹下&#xff0c;新建项目文件夹 go-gin-websocket 进入项目文件夹&#xff0c;打开cmd窗口&#xff0c;在项目&#xff08;go-gin-websocket&a…

【Git 入门教程】第九节、Git的最佳实践

Git是一个强大的版本控制系统&#xff0c;可以帮助开发者管理和协调代码库。然而&#xff0c;正确使用Git并不总是容易。本文将介绍一些Git的最佳实践&#xff0c;以帮助开发者更好地利用Git来管理和协调代码库。 一、编写有意义的提交信息 在使用Git时&#xff0c;编写有意义…

Python编程IDE的选择

Python环境安装之后&#xff0c;接下来就是选择编写Python程序的编辑器了&#xff0c;这里就给大家推荐几种Python编辑器&#xff0c;我们简称这些编辑器为IDE。好的编程IDE可以提高编写代码效率&#xff0c;那咱话不多说&#xff0c;直接开始推荐&#xff01; IDLE 首先&…

有人USR-M100边缘主动上报电流数据到TCP服务器

前两天跟强哥配置了有人的USR-M100模块&#xff0c;实现了采集的电流信号主动上报服务器的功能&#xff0c;昨天去第一污水厂配置了1台、第二污水厂配置了5台、第三污水厂配置了1台&#xff0c;能够将数据上报到甲方的云平台&#xff0c;这里记录一下配置过程&#xff0c;方便以…

推荐4款免费好用的chatGPT平台

1 ShellGPT 这是一款出色的客户端&#xff0c;无需APIkey和科学上网即可访问chatGPT3.5以及绘画AI。项目的github地址如下&#xff1a;https://github.com/akl7777777/free-chatgpt-client-pub/&#xff0c;可在主页下载windows、linux和macOS的安装包&#xff0c;安装后即可使…

力扣刷题2023-04-30-1——题目:剑指 Offer II 007. 数组中和为 0 的三个数

题目&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

React之动态路由创建以及解决刷新白屏问题

动态路由的创建和动态菜单的创建几乎类似&#xff0c;只不过的是&#xff0c;动态路由需要导入组件。这样才能完成跳转。 动态路由与动态菜单一样都需要封装一个转化函数&#xff0c;将后端传来的数据进行转换&#xff0c;转换成我们需要的格式。 需要导入的依赖 导入路由use…

kali: kali工具-Ettercap

kali工具-Ettercap ettercap工具&#xff1a; 用来进行arp欺骗&#xff0c;可以进行ARP poisoning&#xff08;arp投毒&#xff09;&#xff0c;除此之外还可以其他功能&#xff1a; ettercap工具的arp投毒可以截取web服务器、FTP服务器账号密码等信息&#xff0c;简略后打印出…

C++篇--类大小计算、this指针

文章目录 一、类大小计算二、this指针 一、类大小计算 类的大小是只计算它的成员变量或者自定义成员&#xff0c;不会计算它的成员函数大小。 #include<iostream> using namespace std;class A1 { public:void fun(){_a 1;_b 2;}int _a;int _b; };int main() {cout <…

干货 | 赵亚雄:大模型、AI经济和AI基础设施

大家好&#xff0c;我是算想未来的创始人CEO赵亚雄。今天非常高兴到母校来做简短的分享。我们最近会几乎是被ChatGPT、OpenAI等等话题各类的信息轮番轰炸。我希望借助这个机会&#xff0c;把自己这一段时间来思考的有关AI基础设施还有AGI再到大模型等内容&#xff0c;从相对抽象…

ElasticSearch创建文档以及索引文档的详细流程

当我们发起一个查询请求之后&#xff0c;ES是怎么处理这个请求然后返回数据的呢&#xff1f;今天就来详细说一下。 首先看一下整体结构&#xff1a; 在集群模式下一个索引有多个分片&#xff0c;在上图中有三个节点(一个主节点两个从节点)&#xff0c;一个索引被分为两个分片(…

基于协同过滤的旅游推荐系统设计与实现(论文+源码)_kaic

1 绪论 1.1 研究背景及意义 1.2 国内外研究现状 1.3 研究目标与意义 1.4 主要研究工作 2 相关理论介绍 2.1HTML与JavaScript 2.2 MySQL数据库 2.3 协同过滤算法简介 3 系统分析与设计 3.1 系统需求分析 3.1.1 功能性需求 3.1.2 安全性需求 3.2 系统总体架构 3.3 功能模块设计 3…

vue3的props和defineProps

文章目录 1. Props 声明1.1 props用字符串数组来声明Blog.vueBlogPost.vue 1.2 props使用对象来声明Blog.vueBlogPost.vue 2. 传递 prop 的细节2.1 Prop 名字格式2.1 静态Prop & 动态 Prop静态prop动态prop示例Blog.vueBlogPost.vue 2.3 传递不同的值类型NumberBooleanArra…