Go 语言学习笔记之通道 Channel
Go 语言学习笔记之通道 Channel
大家好,我是码农先森。
概念
Go 语言中的通道(channel)是用来在 Go 协程之间传递数据的一种通信机制。
通道可以避免多个协程直接共享内存,避免数据竞争和锁的使用,从而简化了并发程序的实现。
通道有以下特点:
- 通过
make函数创建,指定通道中传输的数据类型。 - 如果指定通道容量,则在发送数据时不会阻塞执行。
- 通道可以是单向或双向的,用于限制通道的发送或接收操作。
- 使用
<-操作符来发送和接收数据。 - 发送数据时会阻塞直到有协程接收数据,接收数据时也会阻塞直到有协程发送数据。
- 可以使用
close函数关闭通道,通知接收方数据已经发送完成。 - 通道可以用于实现数据同步和协程之间的协作。
select 语句
select 语句是专门为通道而设计的,它可以包含若干个候选分支,每个分支中的 case 表达式都会包含针对某个通道的发送或接收操作。
当 select 语句被执行时,它会根据一套分支选择规则选中某一个分支并执行其中的代码。
如果所有的候选分支都没有被选中,那么默认分支就会被执行。注意,发送和接收操作的阻塞是分支选择规则的一个很重要的依据。
通道用法
普通用法
创建一个通道 ch,用于传输整数类型的数据。然后启动一个协程向通道发送数据,发送完毕后关闭通道。
主协程通过 range 循环从通道接收数据,并打印出接收到的数据。当通道被关闭后,循环会结束。
package mainimport "fmt"func main() {// 创建一个通道,用于传输整数类型的数据ch := make(chan int)// 启动一个协程向通道发送数据go func() {for i := 1; i <= 5; i++ {ch <- i // 发送数据到通道}close(ch) // 关闭通道}()// 主协程从通道接收数据for num := range ch {fmt.Println("Received:", num)}
}
结合 Select 语句
创建两个通道 ch1 和 ch2,分别用于传输字符串类型的数据。然后启动两个协程,一个向 ch1 发送 Hello 消息,另一个向 ch2 发送 World 消息,发送间隔分别为 1 秒和 2 秒。
主协程通过 select 不断监听 ch1 和 ch2,一旦其中一个通道有数据就绪,就执行相应的代码块打印接收到的消息。通过 select,我们可以同时处理多个通道的数据交互

package mainimport ("fmt""time"
)func main() {ch1 := make(chan string)ch2 := make(chan string)// 协程1,每隔1秒向 ch1 发送 "Hello"go func() {for {time.Sleep(1 * time.Second)ch1 <- "Hello"}}()// 协程2,每隔2秒向 ch2 发送 "World"go func() {for {time.Sleep(2 * time.Second)ch2 <- "World"}}()// 主协程通过 select 从 ch1 和 ch2 中接收数据for {select {case msg1 := <-ch1:fmt.Println("From ch1:", msg1)case msg2 := <-ch2:fmt.Println("From ch2:", msg2)}}
}
总结
一个通道相当于一个先进先出FIFO的队列。通道中的各个元素值都是严格地按照发送的顺序排列的,先被发送通道的元素值一定会先被接收。元素值的发送和接收都需要用到操作符 <-。
通道避免了多个协程直接共享内存而导致的数据竞争问题,保证了数据的并发安全。通道让不同协程之间可以通过数据传递进行通信,而不用直接关心对方的具体实现细节。
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

相关文章:
Go 语言学习笔记之通道 Channel
Go 语言学习笔记之通道 Channel 大家好,我是码农先森。 概念 Go 语言中的通道(channel)是用来在 Go 协程之间传递数据的一种通信机制。 通道可以避免多个协程直接共享内存,避免数据竞争和锁的使用,从而简化了并发程…...
第 133 场 LeetCode 双周赛题解
A 使所有元素都可以被 3 整除的最少操作数 遍历 n u m s nums nums ,每有一个不被 3 3 3 整除的数,则操作数加 1 1 1 class Solution {public:int minimumOperations(vector<int>& nums) {int res 0;for (auto x : nums)if (x % 3 ! 0)res…...
【仿真】UR机器人相机标定、立体标定、手眼标定、视觉追踪(双目)
实现在CoppeliaSim环境中进行手眼标定和目标追踪的一个例子。它主要涉及到机器人、机器视觉和控制算法的编程,使用了Python语言。接下来对该代码的主要类和方法进行解析: 1. 导入相关库 用于与CoppeliaSim模拟器通过ZeroMQ接口通信。包含Rotation类&…...
功能测试【测试用例模板、Bug模板、手机App测试★】
功能测试 Day01 web项目环境与测试流程、业务流程测试一、【了解】web项目环境说明1.1 环境的定义:项目运行所需要的所有的软件和硬件组合1.2 环境(服务器)的组成:操作系统数据库web应用程序项目代码1.3 面试题:你们公司有几套环境࿱…...
Android音频系统
最近在做UAC的项目,大概就是接收内核UAC的事件,也就是声音相关事件。然后就是pcm_read和AudioTrackr->write之间互传。感觉略微有点奇怪,所以简单总结一下。 1 UAC的简要流程 open_netlink_socket 打开内核窗口,类似于ioctl。…...
Android开发系列(九)Jetpack Compose之ConstraintLayout
ConstraintLayout是一个用于构建复杂布局的组件。它通过将子视图限制在给定的约束条件下来定位和排列视图。 使用ConstraintLayout,您可以通过定义视图之间的约束关系来指定它们的位置。这些约束可以是水平和垂直的对齐、边距、宽度和高度等。这允许您创建灵活而响…...
SpringMVC系列三: Postman(接口测试工具)
接口测试工具 💞Postman(接口测试工具)Postman介绍Postman是什么Postman相关资源Postman安装Postman快速入门Postman完成Controller层测试其它说明 💞课后作业 上一讲, 我们学习的是SpringMVC系列二: 请求方式介绍 现在打开springmvc项目 💞…...
项目实训-vue(十二)
项目实训-vue(十二) 文章目录 项目实训-vue(十二)1.概述2.处理进度可视化 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.处理进度可视化 除了导航栏之外,我们还需要对上传图片以及图片处理的过程以及流程进行…...
达梦数据库的系统视图v$lock
达梦数据库的系统视图v$lock 在达梦数据库(DM)中,V$LOCK 系统视图用于查看当前数据库中的锁定状态。该视图提供了关于所有锁定详细信息,例如锁的内存地址、所属事务 ID,锁类型和锁模式等。这对于数据库管理员进行锁定…...
【无人机三维路径规划】基于树木生长算法TGA实现复杂城市地形下无人机避障三维航迹规划附Matlab代码
% 定义无人机起始位置和目标位置 start_point [0, 0, 0]; % 起始位置 [x, y, z] target_point [100, 100, 100]; % 目标位置 [x, y, z] % 定义城市地形和障碍物信息 city_map imread(‘city_map.png’); % 城市地形图像 obstacles [ 20, 30, 10; % 障碍物1位置 [x, y, z] …...
制造业工厂的管理到底有多难
一、引言 随着全球经济的不断发展,制造业作为实体经济的核心,对国家的经济增长起着至关重要的作用。然而,制造业工厂的管理却是一项复杂而艰巨的任务。本文将深入探讨制造业工厂管理所面临的挑战,并提出相应的应对策略。 二、制造…...
QTday5 2024-06-19
作业要求: 1.思维导图 2.整理代码:TCP服务器 作业1:思维导图 作业2:整理代码 运行代码: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QList>…...
Node官网下载各个版本
node官网下载各个版本地址 例如 14.16.0 Index of /download/release/v14.16.0/...
备战秋招day4
算法 242. 有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {int[] count new int[26];for(int i 0;i<s.length();i){count[s.charAt(i)-a];}for(int i 0;i<t.length();i){count[t.charAt(i)-a]--;if(count[t.charAt(i)-a]<0){r…...
【华为OD机试B卷】服务器广播、需要广播的服务器数量(C++/Java/Python)
题目 题目描述 服务器连接方式包括直接相连,间接连接。 A和B直接连接,B和C直接连接,则A和C间接连接。 直接连接和间接连接都可以发送广播。 给出一个N*N数组,代表N个服务器, matrix[i][j] 1, 则代表i和j直…...
目标检测数据集 - 手机屏幕表面表面缺陷检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:手机屏幕表面缺陷检测数据集,真实采集高质量手机屏幕表面含缺陷图片数据,数据集含多款不同型号和品牌的手机屏幕表面图片数据,包括苹果手机屏、三星手机屏、华为手机屏等数据。数据标注标签包括 Bubble 气泡/水滴、Scr…...
语音相关算法学习整理
最近看了一下百度paddlespeech的一些公开课,把课程里的视频内容大体听了一下,现在整理一下笔记。教程链接见:飞桨AI Studio星河社区-人工智能学习与实训社区 语音识别的过程可以这样简单概括: 将声音信号经过预加重、加窗、fft等…...
[C#] opencvsharp对Mat数据进行序列化或者反序列化以及格式化输出
【简要介绍】 在OpenCVSharp中,FileStorage类用于将数据(包括OpenCV的Mat类型数据)序列化为XML或YAML格式的文件,以及从这些文件中反序列化数据。以下是关于FileStorage类用法的详细说明: 写入数据(序列化…...
Linux中的TCP与UDP:理解两者的差异
在计算机网络的世界中,TCP(传输控制协议)和UDP(用户数据报协议)是两种至关重要的传输层协议。它们就像是我们日常生活中的通信方式,有着不同的使用场景和优缺点。通过一个简单的比喻,我们可以更…...
通信系统网络架构_1.局域网网络架构
当今,通信网络从大的方面主要包括局域网、广域网、移动通信网等网络形式。不同的网络会采用不同的技术进行网络构建。以下针对不同的网络给出各自的网络架构以及所采用的技术。 1.概述 局域网,即计算机局部区域网络,是一种为单一机构所拥有的…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
