channel通道笔记
channel通道笔记
介绍
-
语法
- 1.一般使用
make创建channel(常用)c := make(chan datatype),datatype是数据类型
- 2.直接显示声明,创建的值为空,一般没有太大意义
var c chan datatype
- 1.一般使用
-
三种定义写法:
- 既可以收数据又可以发数据:
chan datatype - 只可以收数据:
chan <- datatype - 只可以发数据:
<- chan datatype
- 既可以收数据又可以发数据:
-
用法
- 将数据发送到通道:
channel变量 <- 数据,eg:c <- 10 - 将通道数据发出:
接收变量名:= <- channel变量,egdata := <- c - 将数据丢掉:
<- channel变量,不接收数据
- 将数据发送到通道:
-
注意
- 通道一次只能接收一次数据,等到通道内部数据被接收后,再接收下一个数据
-
类型
- 介绍:通道分为有缓冲和无缓冲的通道,Go提供内置函数
len和cap,无缓冲的通道的len和cap都是0,有缓冲的len表示没有被读取的元素数,cap代表整个通道的容量 - 作用
- 无缓冲:通信和两个
goroutine的同步(没有缓冲,一旦接收就要有人来收数据不然就报错) - 有缓冲:主要通信(因为有缓冲所以可以保存数据,意义是一接收到数据可以没有人收(不报错))
- 无缓冲:通信和两个
- 语法:
- 无缓冲:
make(chan datatype) - 有缓冲:
make(chan datatype,len),创建缓冲为len的通道
- 无缓冲:
- 介绍:通道分为有缓冲和无缓冲的通道,Go提供内置函数
-
实现
goroutine之间的同步等待- 代码实现
func main() {/创建无缓冲通道c := make(chan struct{})//通道要做的事情go func(i chan struct{}) {sum := 0for i := 0; i < 10000; i++ {sum += i}println(sum)//数据写进通道c <- struct{}{}}(c)println(runtime.NumGoroutine())//读通道c,通过通道进行同步等待<-c//丢掉数据}写到缓冲通道的数据不会消失,加上这一点我们可以实现用无缓冲同步
goroutines,用有缓冲存储数据- 代码演示
func main() {c := make(chan struct{})ci := make(chan int, 100)go func(i chan struct{}, j chan int) {for i := 0; i < 10; i++ {ci <- i}close(ci)//写通道c <- struct{}{}}(c, ci)fmt.Printf("----------\n")println(runtime.NumGoroutine())//读通道c,通过通道进行同步等待<-c//此时ci通道已经关闭,匿名函数启动的goroutine已经退出fmt.Printf("----------\n")println(runtime.NumGoroutine())//但通道ci还可以继续读取fmt.Printf("----------\n")for v := range ci {println(v)}}详细解读:
1.创建两个通道 c 和 ci,其中 c 是一个无缓冲通道,用于协程的同步等待;ci 是一个带有缓冲区大小为 100 的通道,用于向协程传递整数。
2.启动一个匿名函数作为一个新的协程,并将 c 和 ci 作为参数传递给它。
3.协程中的 for 循环会向 ci 通道中写入 0 到 9 的整数,然后通过调用 close(ci) 来关闭通道。
4.在协程的最后,向 c 通道写入一个空结构体,以通知主协程协程已经完成。
5.在主协程中,调用runtime.NumGoroutine()打印当前的goroutine 数量,此时应该只有主协程和一个新的协程。
6.等待协程完成,通过 <-c 读取 c 通道中的值,阻塞主协程,直到协程完成。
7.执行runtime.NumGoroutine(),此时应该只有主协程,新的协程已经退出。
8.使用for v := range ci循环读取ci通道中的值,由于通道已经关闭,因此循环会在所有值都被读取后结束。
9.在循环中,使用 println(v) 打印从 ci 通道中读取的每个整数。 -
补充
- 接收通道数据
- 1.使用
range接收:for v := range ci{}//ci为通道数据 - 2.使用
if value,ok := ci,通过判断ok来判断数据是否结束
- 1.使用
- 接收通道数据
-
操作不同状态触发的三种行为
- 触发
panic- 1.向已经关闭的通道写入数据(关闭通道应该由写入者关闭)
- 2.重复关闭的通道
- 阻塞
- 1.向未初始化的通道写入数据或读取数据导致当前
goroutine永久阻塞 - 2.向缓冲区已满的通道写入数据会导致
goroutine阻塞 - 3.通道中没有数据,读取该通道会导致
goroutine阻塞
- 1.向未初始化的通道写入数据或读取数据导致当前
- 非阻塞
- 1.读取已经关闭的通道不会引发阻塞,而是立即返回通道元素类型的零值
- 2.向有缓冲且没有满的通道读/写不会引发阻塞
- 触发
2.利用循环取有缓存的通道数据
- 取数据需要用
for range - 取数据前需要将通道关闭:
close(channel) - 如果用
for循环取数据,不能写成for i:=0;i<len(channel);i++,因为len的大小会随着去除数据而变小,解决方案: 提前用num保存channel的最初数量
相关文章:
channel通道笔记
channel通道笔记 介绍 语法 1.一般使用make创建channel(常用) c : make(chan datatype),datatype是数据类型 2.直接显示声明,创建的值为空,一般没有太大意义 var c chan datatype 三种定义写法: 既可以收数据又可以发数据:chan datatype只可以收数据:chan <- datatype只可…...
无涯教程-Lua - 面向对象
面向对象编程(OOP)是现代编程时代中使用最广泛的编程技术之一。 OOP的特征 类(Class) - 类是用于创建对象的可扩展模板。 对象(Objects) - 它是类的实例,并为其分配了单独的内存空间。 继承(Inheritance) - 这是一个概…...
Java中的IOUtils是什么?
Java中的IOUtils是一个工具类,用于简化文件和流的操作。它提供了一些常用的方法,如复制文件、读取文件、写入文件等。 下面是一个简单的示例,演示如何使用IOUtils来复制文件: import org.apache.commons.io.FileUtils; import j…...
电源板(220V转3.3V)调试问题总
目录 现象: 问题可能的影响: 排查过程: 1.测试EC3,C2都在6V左右, 2.怀疑变压器的问题。 2.怀疑原边反馈控制芯片的问题。 3.怀疑后级电路的问题。 现象: 电源板输出3.28V输出正常。 但是测试前级电压…...
【webpack】一些零碎的知识点记录:eslint配置、source-map配置、devServer配置
文章目录 前言eslint安装配置设置规则 devtool设置js.map文件使用模式解释文件说明建议方案 devServer安装配置 前言 有些知识点不知道咋归类,就先暂时放在同一个文章里了。这里只记录配置方式,配置的东西是什么就不过多解释了,因为一般需要…...
VUE之JWT前后端分离认证,学生管理系统
参考资料: SpringBoot搭建教程 SpringCloud搭建教程 JWT视频教程 JWT官网 Vue视频教程 JWT视频参考资料、VUE视频资料,及前后端demo 特别有参考价值的JWT博客1 特别有参考价值的JWT博客2 cookie、localstorage和sessionStorage的区别1 cookie、localstorage和sessi…...
Go学习第五天
Golang中面向对象类的表示与封装 package mainimport "fmt"// 如果类名首字母大写,表示其他包也能够访问 type Hero struct {// 如果类的属性首字母大写,表示该属性是对外能够访问的,否则的话只能够类的内部访问Name stringAd …...
在vue项目中封装WebSockets请求
在Vue项目中封装WebSocket请求包括以下步骤: 1. 安装WebSocket库:首先,导入WebSocket库,例如vue-native-websocket或socket.io-client。根据项目需求选择适当的库,并根据官方文档进行安装和配置。 2. 创建WebSocket服务…...
Linux进程(二)
文章目录 进程(二)Linux的进程状态R (running)运行态S (sleeping)阻塞状态D (disk sleep)深度睡眠T(stopped)状态X(dead)状态Z&#x…...
使用pg_prewarm缓存PostgreSQL数据库表
pg_prewarm pg_prewarm 直接利用系统缓存的代码,对操作系统发出异步prefetch请求,在应用中,尤其在OLAP的情况下,对于大表的分析等等是非常耗费查询的时间的,而即使我们使用select table的方式,这张表也并不可能将所有…...
LeetCode 28题:找出字符串中第一个匹配项的下标
题目 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystac…...
flink+kafka+doris+springboot集成例子
目录 一、例子说明 1.1、概述 1.1、所需环境 1.2、执行流程 二、部署环境 2.1、中间件部署 2.1.1部署kakfa 2.1.1.1 上传解压kafka安装包 2.1.1.2 修改zookeeper.properties 2.1.1.3 修改server.properties 2.1.1.3 启动kafka 2.1.2、部署flink 2.1.2.1 上传解压f…...
ARM裸机-14(S5PV210的时钟系统)
1、时钟系统 1.1、什么是时钟 时钟是同步工作系统的同步节拍 1.2、SoC为什么需要时钟 Soc内部有很多器件,例如CPU、串口、DRAM控制制器、GPIO等内部外设,这些东西要彼此协同工作,需要一个同步的时钟系统来指挥。这个就是我们SoC的时钟系统。…...
Milvus Cloud凭借AI原生,可视化优势荣登全球向量数据库性能排行榜VectorDBBench.com 榜首
在当今的大数据时代,随着人工智能技术的快速发展,向量数据库作为处理大规模数据的关键工具,其性能和效率越来越受到关注。最近,全球向量数据库性能排行榜 VectorDBBench.com 公布了一份最新的评估报告,引人瞩目的是,成立不到一年的新兴公司 Milvus Cloud 凭借其 AI 原生和…...
测试岗?从功能测试进阶自动化测试开发,测试之路不迷茫...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试新人在想什么…...
算法与数据结构(五)--树【1】树与二叉树是什么
一.树的定义 树是一个具有层次结构的集合,是由一个有限集和集合上定义的一种层次结构关系构成的。不同于线性表,树并不是线性的,而是有分支的。 树(Tree)是n(n>0)个结点的有限集。 若n0&…...
打开的idea项目maven不生效
方法一:CtrlshiftA(或者help---->find action), 输入maven, 点击add maven projects,选择本项目中的pom.xml配置文件,等待加载........ 方法二:view->tools windows->mave…...
kvm+qemu+libvirt管理虚机
virt-manager 图形化创建虚拟机 #virt-manager纳管远程kvm虚拟机 # 可以指定kvm虚机的ssh端口和virt-manager所在主机的私钥 virt-manager -c qemussh://root10.197.115.17:5555/system?keyfileid_rsa --no-fork # 如果你生成的ssh-key 的名称是 test-key,在/home/ssh-key/ 目…...
电气防火限流式保护器在汽车充电桩使用上的作用
【摘要】 随着电动汽车行业的不断发展,电动汽车充电设施的使用会变得越来越频繁和广泛。根据中汽协数据显示,2022年上半年,我国新能源汽车产销分别完成266.1万辆和260万辆,同比均增长1.2倍,市场渗透率达21.6%。因此,电动汽车的安全…...
VBA技术资料MF38:VBA_在Excel中隐藏公式
【分享成果,随喜正能量】佛祖也无能为力的四件事:第一,因果不可改,自因自果,别人是代替不了的;第二,智慧不可赐,任何人要开智慧,离不开自身的磨练;第三&#…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
LTR-381RGB-01RGB+环境光检测应用场景及客户类型主要有哪些?
RGB环境光检测 功能,在应用场景及客户类型: 1. 可应用的儿童玩具类型 (1) 智能互动玩具 功能:通过检测环境光或物体颜色触发互动(如颜色识别积木、光感音乐盒)。 客户参考: LEGO(乐高&#x…...
持续交付的进化:从DevOps到AI驱动的IT新动能
文章目录 一、持续交付的本质:从手动到自动的交付飞跃关键特性案例:电商平台的高效部署 二、持续交付的演进:从CI到AI驱动的未来发展历程 中国…...
