channel通道笔记

channel通道笔记


介绍

  • 语法

    • 1.一般使用make创建channel(常用)
      • c := make(chan datatype),datatype是数据类型
    • 2.直接显示声明,创建的值为空,一般没有太大意义
      • var c chan datatype
  • 三种定义写法:

    • 既可以收数据又可以发数据:chan datatype
    • 只可以收数据:chan <- datatype
    • 只可以发数据:<- chan datatype
  • 用法

    • 将数据发送到通道:channel变量 <- 数据,eg:c <- 10
    • 将通道数据发出:接收变量名:= <- channel变量 ,egdata := <- c
    • 将数据丢掉:<- channel变量,不接收数据
  • 注意

    • 通道一次只能接收一次数据,等到通道内部数据被接收后,再接收下一个数据
  • 类型

    • 介绍:通道分为有缓冲无缓冲的通道,Go提供内置函数lencap,无缓冲的通道的lencap都是0,有缓冲的len表示没有被读取的元素数,cap代表整个通道的容量
    • 作用
      • 无缓冲:通信和两个goroutine的同步(没有缓冲,一旦接收就要有人来收数据不然就报错)
      • 有缓冲:主要通信(因为有缓冲所以可以保存数据,意义是一接收到数据可以没有人收(不报错))
    • 语法:
      • 无缓冲:make(chan datatype)
      • 有缓冲:make(chan datatype,len),创建缓冲为len的通道
  • 实现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来判断数据是否结束
  • 操作不同状态触发的三种行为

    • 触发panic
      • 1.向已经关闭的通道写入数据(关闭通道应该由写入者关闭)
      • 2.重复关闭的通道
    • 阻塞
      • 1.向未初始化的通道写入数据或读取数据导致当前goroutine永久阻塞
      • 2.向缓冲区已满的通道写入数据会导致goroutine阻塞
      • 3.通道中没有数据,读取该通道会导致goroutine阻塞
    • 非阻塞
      • 1.读取已经关闭的通道不会引发阻塞,而是立即返回通道元素类型的零值
      • 2.向有缓冲且没有满的通道读/写不会引发阻塞

2.利用循环取有缓存的通道数据

  • 取数据需要用for range
  • 取数据前需要将通道关闭: close(channel)
  • 如果用for循环取数据,不能写成for i:=0;i<len(channel);i++,因为len的大小会随着去除数据而变小,解决方案: 提前用num保存channel的最初数量

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

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

相关文章

求解n阶勒让德多项式的值

描述 用递归方法求n阶勒让德多项式的值&#xff0c;递归公式为&#xff1a; 在主函数中输入一个整数n和一个实数x&#xff0c;调用函数 legendre(n,x)&#xff0c;并输出其返回值。 输入 第一行输入一个整数n&#xff0c;表示阶数&#xff1b;第二行输入一个实数x。 输出 …

python学习(廖雪峰的官方网站部分,自学笔记)

python学习 廖雪峰的官方网站强烈推荐 字符串 Python提供了ord()函数获取字符的整数表示&#xff0c;chr()函数把编码转换为对应的字符 ord( )先当与把字符转成整形&#xff0c;chr( ) 把编码转化成相应的字符 有些时候&#xff0c;字符串里面的%是一个普通字符怎么办&…

java-多线程简述

目录 1.实现多线程1.1简单了解多线程【理解】1.2并发和并行【理解】1.3进程和线程【理解】1.4实现多线程方式一&#xff1a;继承Thread类【应用】1.5实现多线程方式二&#xff1a;实现Runnable接口【应用】1.6实现多线程方式三: 实现Callable接口【应用】1.7设置和获取线程名称…

Photon之如何解决Photon Server无法在局域网使用的bug

前言 先介绍一下Photon的两个服务器服务: Photon Cloud 是一个完全托管的软件即服务 (SaaS) 解决方案。我们可以完全专注于应用程序客户端,而托管、服务器操作和扩展均由光子官方负责。 Photon Server 是一个本地服务器应用程序,我们可以在本地或指定的计算机上运行和托管。…

P5960 【模板】差分约束算法

【模板】差分约束算法 题目描述 给出一组包含 m m m 个不等式&#xff0c;有 n n n 个未知数的形如&#xff1a; { x c 1 − x c 1 ′ ≤ y 1 x c 2 − x c 2 ′ ≤ y 2 ⋯ x c m − x c m ′ ≤ y m \begin{cases} x_{c_1}-x_{c_1}\leq y_1 \\x_{c_2}-x_{c_2} \leq y_2 \\…

【机器学习】 贝叶斯理论的变分推理

许志永 一、说明 贝叶斯原理&#xff0c;站在概率角度上似乎容易解释&#xff0c;但站在函数立场上就不那么容易了&#xff1b;然而&#xff0c;在高端数学模型中&#xff0c;必须要在函数和集合立场上有一套完整的概念&#xff0c;其迭代和运算才能有坚定的理论基础。 二、贝叶…

Sequence 2023牛客暑期多校训练营6 E

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;有一长度为n的数组a&#xff0c;有q次询问&#xff0c;每次要求将[l,r]的区间分成k个连续区间&#xff0c;满足每个区间和都是偶数&#xff0c;能满足要求就输出YES 1<n,q<1e5;0<ai<1e10;1<l<r&l…

Gson:解析JSON为复杂对象:TypeToken

需求 通过Gson&#xff0c;将JSON字符串&#xff0c;解析为复杂类型。 比如&#xff0c;解析成如下类型&#xff1a; Map<String, List<Bean>> 依赖&#xff08;Gson&#xff09; <dependency><groupId>com.google.code.gson</groupId><art…

在CSDN学Golang场景化解决方案(EFK分布式日志系统方案)

一&#xff0c;ElasticSearch 分布式集群部署 在 Golang EFK 分布式日志系统方案中&#xff0c;ElasticSearch 是一个分布式搜索引擎和数据存储库&#xff0c;它可以用于存储和搜索大量的日志数据。以下是 ElasticSearch 分布式集群部署的步骤&#xff1a; 下载 ElasticSearc…

MyBatis核心 - SqlSession如何通过Mapper接口生成Mapper对象

书接上文 MyBatis – 执行流程 我们通过SqlSession获取到了UserMapper对象&#xff0c;代码如下&#xff1a; // 获取SqlSession对象 SqlSession sqlSession sqlSessionFactory.openSession();// 执行查询操作 try {// 获取映射器接口UserMapper userMapper sqlSession.get…

vue SKU已知sku.tree算出sku.list类目值和id

已知sku.tree算出sku.list类目值和id <van-skuref"sku"v-model"showBase":close-on-click-overlay"closeOnClickOverlay":goods"skuData.goods_info":goods-id"skuData.goods_id":hide-stock"skuData.sku.hide_stoc…

数据结构---B树

目录标题 B-树的由来B-树的规则和原理B-树的插入分析B-树的插入实现准备工作find函数insert中序遍历 B-树的性能测试B-树的删除B树B树的元素插入B*树的介绍 B-树的由来 在前面的学习过程中&#xff0c;我们见过很多搜索结构比比如说顺序查找&#xff0c;二分查找&#xff0c;搜…

mac安装nacos,M1芯片

第一步&#xff0c;官网下载 》nacos官网 去github中下载对应的版本&#xff0c;本人下载的是1.4.1版本 在这儿选择其他的版本&#xff0c;下面这里选择 tar.gz 压缩包 解压后放到一个非中文的目录下&#xff0c;我选择在 user目录下面创建一个other目录&#xff0c;将使用的环…

初识Flask:Python轻量级Web框架入门教程

Flask是一个用Python编写的轻量级Web应用框架。由于其“微”性质&#xff0c;Flask在提供核心服务的同时&#xff0c;仍然提供了许多扩展的可能性。在这篇文章中&#xff0c;我们将从最基础开始&#xff0c;学习如何使用Flask构建一个Web应用。 一、安装与初次启动 首先&…

[回馈]ASP.NET Core MVC开发实战之商城系统(五)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页【商品类型&#xff0c;ba…

freeswitch的mod_xml_curl模块动态获取dialplan

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 mod_xml_curl模块支持从web服务获取xml配置&#xff0c;本文介绍如何动态获取dialplan配置。 环境 centos&#xff1a;CentOS release 7.0 (Final)或以上版本 freeswitch&#xff1a;v1.6.20 GCC&#xff1a;4.8.5…

人机融合智能中的事实与价值

在人机融合智能中&#xff0c;事实和价值分别扮演着不同的角色和功能。 事实是客观存在的真实描述&#xff0c;可以通过数据、观测和验证等方式获取。在人机融合智能中&#xff0c;人工智能通过处理和分析大量的数据来提供客观事实的支持。例如&#xff0c;在搜索引擎中&#x…

小乌龟(TortoiseGit)连接GitLab

目录 &#x1f35f;写在前面 &#x1f35f;实验目标 &#x1f35f;安装gitlab &#x1f37f;1、安装依赖 &#x1f37f;2、下载清华gitlab包 &#x1f37f;3、安装gitlab &#x1f37f;4、修改配置文件 &#x1f37f;5、管理命令 &#x1f35f;访问gitlab &#x1f35f;界面设置…

【WebRTC---源码篇】(二:一)PeerConnection详解

Track的添加 上图是整体流程图 RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::AddTrack(rtc::scoped_refptr<MediaStreamTrackInterface> track,const std::vector<std::string>& stream_ids) {RTC_DCHECK_RUN_ON(signal…

Spring Cloud Eureka 和 zookeeper 的区别

CAP理论 在了解eureka和zookeeper区别之前&#xff0c;我们先来了解一下这个知识&#xff0c;cap理论。 1998年的加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式有三个指标。Consistency&#xff0c;Availability&#xff0c;Partition tolerance。简称即为CAP。…