Golang开发--channel的使用
在 Go 语言中,channel(通道)是一种用于在 goroutine 之间进行通信和同步的并发原语。它提供了一种安全且简单的方式来传递数据。
通道的详细描述和使用方法
1.定义通道:
通道是通过使用 make 函数来创建的。通道有特定的类型,用于指定通道中传输的数据的类型。例如,ch := make(chan int) 创建了一个整型数据传输的通道。
2.发送和接收数据:
使用 <- 运算符可以将数据发送到通道或从通道接收数据。发送操作将数据发送到通道中,接收操作从通道中接收数据。例如,ch <- data 将数据 data 发送到通道 ch 中,result := <- ch 从通道 ch 中接收数据,并将其存储在变量 result 中。
3.阻塞和同步:
通道提供了同步的机制,当发送或接收操作发生时,它们可以阻塞当前的 goroutine。发送操作在通道已满时会阻塞,直到有其他 goroutine 从通道中接收数据。接收操作在通道为空时会阻塞,直到有其他 goroutine 向通道发送数据。这种阻塞机制可以用于确保 goroutine 之间的同步。
4.关闭通道:
可以使用 close 函数关闭通道。关闭通道后,任何接收操作都会立即完成,并返回通道中剩余的数据。对已关闭的通道进行发送操作会引发 panic。可以使用多返回值来判断通道是否已关闭,例如,data, ok := <- ch,其中 ok 的值为 false 表示通道已关闭。
5.通道的容量和阻塞:
通道可以有一个可选的容量,用于限制可以在通道中存储的元素数量。未指定容量时,通道为无缓冲通道,发送和接收操作会彼此阻塞,直到另一个 goroutine 准备好进行配对操作。指定容量时,通道为有缓冲通道,可以在不阻塞发送操作的情况下存储一定数量的元素。只有当通道已满时,发送操作才会阻塞。
6.使用 select 语句:
```select 语句可以用于在多个通道之间进行非阻塞的选择操作。它可以监听多个通道的发送和接收操作,并执行第一个准备就绪的操作。select语句可以与case子句一起使用,每个case` 子句对应一个通道操作。
通道是 Go 语言中实现并发通信的重要机制之一。它们是线程安全的,可以安全地在多个 goroutine 之间传递数据,并提供了简单而有效的同步机制。通过合理使用通道,可以实现高效的并发编程。
代码示例
阻塞和同步:
通道的阻塞特性可用于实现同步。例如,当一个 goroutine 需要等待另一个 goroutine 完成某些操作时,可以使用通道来进行同步。下面是一个简单的示例:
package mainimport "fmt"func worker(done chan bool) {fmt.Println("正在执行工作...")// 模拟工作耗时// ...fmt.Println("工作完成")done <- true // 发送完成信号到通道
}func main() {done := make(chan bool) // 创建通道go worker(done) // 启动工作协程<-done // 等待工作完成的信号fmt.Println("主程序结束")
}
在上述示例中,worker 函数执行一些工作,并将完成信号发送到 done 通道。在主程序中,我们等待从 done 通道接收到完成信号后才继续执行。这样可以确保主程序在工作完成前不会提前结束。
通道的迭代:
可以在 for 循环中使用通道进行迭代,直到通道关闭。这样可以便捷地处理通道中的元素。下面是一个示例:
package mainimport "fmt"func main() {nums := []int{2, 4, 6, 8, 10}ch := make(chan int)go func() {for _, num := range nums {ch <- num // 发送元素到通道}close(ch) // 关闭通道}()for num := range ch {fmt.Println(num) // 从通道接收元素并打印}
}
在上述示例中,我们将整数切片中的元素发送到通道 ch 中。然后,使用 range 循环从通道 ch 中接收元素,并打印每个元素的值。当通道关闭后,range 循环会自动退出。
使用 select 语句:
```select` 语句可以同时监听多个通道的操作,执行第一个准备就绪的操作。下面是一个示例:
package mainimport ("fmt""time"
)func main() {ch1 := make(chan string)ch2 := make(chan string)go func() {time.Sleep(2 * time.Second)ch1 <- "通道1"}()go func() {time.Sleep(1 * time.Second)ch2 <- "通道2"}()select {case msg1 := <-ch1:fmt.Println("接收到:", msg1)case msg2 := <-ch2:fmt.Println("接收到:", msg2)}
}
在上述示例中,我们启动了两个 goroutine,分别向 ch1 和 ch2 通道发送数据。然后,使用 select 语句监听这两个通道的接收操作,并执行第一个准备就绪的操作。在本例中,ch2 通道的发送操作先就绪,因此会打印接收到的消息。
这些示例展示了在 Go 中定义和使用通道的常见模式。通道是 Go 语言中实现并发通信的强大工具,可以在多个 goroutine 之间安全地传递数据和实现同步。通过灵活运用通道,可以编写出安全、高效的并发程序。
相关文章:
Golang开发--channel的使用
在 Go 语言中,channel(通道)是一种用于在 goroutine 之间进行通信和同步的并发原语。它提供了一种安全且简单的方式来传递数据。 通道的详细描述和使用方法 1.定义通道: 通道是通过使用 make 函数来创建的。通道有特定的类型&am…...
SQL sever中表管理
目录 一、创建表: 1.1语法格式: 1.2示例: 二、修改表: 2.1语法格式: 2.2示例: 三、删除表: 3.1语法格式: 3.2示例: 四、查询表: 4.1语法格式&…...
CSSoverflow 属性
overflow 属性用于设置当元素中的内容溢出后的情况。 值得注意的是: 所谓溢出,是指子元素的大小(包括文本、元素或图片等)超出父元素的区域,会有一部分内容显示在父元素所在的区域外。 属性值描述visible默认值。内容不会被修剪&a…...
08:STM32----DMA数据转运
目录 1:简历 2:存储器映像 3:DMA基本结构 4: DMA转运的条件 5:DMA请求 A:DMA数据转运 1:连接图 2:数据转运DMA 3:函数介绍 4:步骤 5:代码 B:DMAAD多通道 1:连接图 2:结构图 3:函数介绍 4:代码 1:简历 DMA(Direct Memory Access)直接存储…...
Golang 程序漏洞检测利器 govulncheck(二):漏洞数据库详解
上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 的使用方法,govulncheck 强大功能的背后,离不开 Go 漏洞数据库(Go vulnerability database)的支持,接下来详细讲解下 Go 漏洞数据库相关的知识。 Go 漏洞数…...
[JDK8下的HashMap类应用及源码分析] 数据结构、哈希碰撞、链表变红黑树
系列文章目录 [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用及源码分析 [Java基础] String,分析内存地址,源码 [JDK8环境下的HashMap类应用及源码分析] 第一篇 空构造函数初始化 [JDK8环境下的HashMap类应用及源码分…...
高等数学刷题
两个公式本质都是相同的 Π/2 1^∞类型...
lintcode 1840 · 矩阵还原【中等 vip 二维前缀和数组】
题目 https://www.lintcode.com/problem/1840 现有一个n行m列的矩阵 before,对于before里的每一个元素 before[i][j],我们会使用以下算法将其转化为 after[i][j]。现给定after矩阵,请还原出原有的矩阵before。s 0 for i1: 0 -> ifor j1…...
VMware虚拟机+Centos7 配置静态,动态IP
本章目录 一、查看网关: 编辑–>虚拟网络编辑器二、点击NAT设置三、记住网关IP待会要用四、配置静态ip地址1、进入存放修改IP地址的目录2、修改ip地址的文件3、编辑文件4、文件(编辑好后退出) 五、重启网络六、测试1、linux上查看IP地址的…...
【C++精华铺】10.STL string模拟实现
1. 序言 STL(标准模板库)是一个C标准库,其中包括一些通用的算法、容器和函数对象。STL的容器是C STL库的重要组成部分,它们提供了一种方便的方式来管理同类型的对象。其中,STLstring是一种常用的字符串类型。 STLstrin…...
微信小程序开发---事件的绑定
目录 一、事件的概念 二、小程序中常用的事件 三、事件对象的属性列表 四、bindtap的语法格式 (1)绑定tap触摸事件 (2)编写处理函数 五、在事件处理函数中为data中的数据赋值 六、事件传参 七、bindinput的语法格式 八、…...
基于Hata模型的BPSK调制信号小区覆盖模拟matlab完整程序分享
基于Hata信道模型的BPSK调制信号小区覆盖模拟matlab仿真,对比VoIP, Live Video,FTP/Email 完整程序: clc; clear; close all; warning off; addpath(genpath(pwd)); % Random bits are generated here. bits randi([0, 1], [50,1]); M 2; t 1:1:50; …...
音视频 ffmpeg视频裁剪
将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;x和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显示长宽比) cropow[:oh[:x[:y[:keep_as…...
Web3数据云OORT推出商用版智能代理构建平台:OORT TDS
随着技术进步和数据隐私问题的日益凸显,生成式AI和去中心化技术联手为企业和个人开辟了全新的互动视野。站在这一趋势的前沿,OORT展现了其在去中心化数据云领域的技术实力,作为行业的领先者,今日Oort正式宣布OORT TDS (Talk-to-Da…...
ChatGPT:革命性的自然语言处理技术
自然语言处理(NLP)技术的快速发展已经为我们的日常生活带来了巨大的变革。在这个领域,ChatGPT作为一个突出的代表,正在为我们带来更多的便利和机会。本文将介绍ChatGPT的基本概念、应用领域以及它在未来可能带来的影响。 ChatGPT…...
利用frps搭建本地自签名https服务的透传
nginx的搭建就不介绍了,教程很多,基本上油手就会。 在本例中,frp服务器的域名是 www.yourfrp.com,同时也是反向代理nginx服务器; 本地网站要用的域名: test.abcd.com 请事先将 test.abcd.com 解析到 frp所在服务器…...
安卓手机安装Linux然后在其中安装(jdk,MySQL,git)
安卓手机安装Linux然后在其中安装(jdk,MySQL,git) 一.安卓手机安装Linux 安装termux最新教程_哔哩哔哩_bilibili Linux入门教程__阿伟_的博客-CSDN博客 二.安装jdk Termux手机终端运行java。jdk环境的搭建_哔哩哔哩_bilibili java后端__阿伟_的博客-CSD…...
javaee之黑马乐优商城2
简单分析一下商品分类表的结构 先来说一下分类表与品牌表之间的关系 再来说一下分类表和品牌表与商品表之间的关系 面我们要开始就要创建sql语句了嘛,这里我们分析一下字段 用到的数据库是heima->tb_category这个表 现在去数据库里面创建好这张表 下面我们再去编…...
Qt打开及创建项目,运行程序(1)
安装之后, 1.文件->新建文件或项目 2.Application->Qt Widgets Application 3.自己设置名称和路径 4.这一步非常非常重要,要选择编译器,(MinGW是可以在Qt里用,如果想与VS交互,要选择MSVC)…...
八种十倍提升API性能的方式
提起API,作为程序员来说并不陌生,很多程序员的大部分工作都是围绕着它, 然而,有些内容被大家忽略,API的性能会直接影响产品的用户体验,比如,一个视频软件,播放1s后需要加载5s&#x…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
