go理论知识——Go Channel 笔记 [特殊字符]

news2025/4/19 21:50:43

go理论知识——Go Channel 笔记 📝

1. 基本概念 🧠

1.1 Channel 是什么?

  • Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。
  • Channel 是类型安全的,意味着你只能发送和接收特定类型的数据。

1.2 Channel 的创建 🏗️

  • 使用 make 函数创建 Channel:
  c := make(chan int)
  • 可以创建带缓冲的 Channel:
  c := make(chan int, 3) // 缓冲区大小为 3

2. 无缓冲 Channel 🚫

2.1 无缓冲 Channel 的特性

  • 无缓冲 Channel 是同步的,发送和接收操作会阻塞,直到另一端准备好。
  • 示例代码:
    c := make(chan int)
    go func() {
        defer fmt.Println("goroutine 结束")
        fmt.Println("goroutine is running……")
        c <- 666
    }()
    num := <-c
    fmt.Println("num = ", num)
    

image-20250127232441634

2.2 运行结果

  • Goroutine 会发送 666 到 Channel,主 Goroutine 会接收并打印这个值。

3. 带缓冲 Channel 🛠️

3.1 带缓冲 Channel 的特性

  • 带缓冲 Channel 是异步的,只有在缓冲区满时发送操作才会阻塞,只有在缓冲区空时接收操作才会阻塞。
  • 示例代码:
    c := make(chan int, 3)
    go func() {
        for i := 0; i < 3; i++ {
            c <- i
            fmt.Println("子go程正在运行,发送的元素:", i, " len(c) = ", len(c), " cap(c) = ", cap(c))
        }
    }()
    time.Sleep(2 * time.Second)
    for i := 0; i < 3; i++ {
        num := <-c
        fmt.Println("父go程正在运行,收到的元素:", num, " len(c) = ", len(c), " cap(c) = ", cap(c))
    }
    

3.2 运行结果

  • 子 Goroutine 会发送 3 个元素到 Channel,主 Goroutine 会接收并打印这些元素。

4. 关闭 Channel 🚪

4.1 关闭 Channel 的作用

  • 使用 close 函数关闭 Channel,关闭后不能再发送数据,但可以继续接收数据。
  • 示例代码:
    c := make(chan int)
    go func() {
        for i := 0; i < 5; i++ {
            c <- i
        }
        close(c)
    }()
    for data := range c {
        fmt.Println(data)
    }
    

4.2 注意事项

  • 只有在没有任何数据需要发送时才关闭 Channel。
  • 关闭后的 Channel 不能再发送数据,但可以继续接收数据。

5. Select 语句 🔄

5.1 Select 语句的作用

  • select 语句用于在多个 Channel 操作中进行选择,类似于 switch 语句。
  • 示例代码:
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 6; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacii(c, quit)
    

image-20250127232414168

image-20250127232338384

5.2 运行结果

  • fibonacii 函数会生成斐波那契数列并通过 Channel 发送,直到接收到 quit 信号。

6. 总结 📌

  • Channel 是 Go 语言中非常重要的并发编程工具。
  • 无缓冲 Channel 是同步的,带缓冲 Channel 是异步的。
  • 使用 close 关闭 Channel,使用 select 处理多个 Channel 操作。

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

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

相关文章

论文阅读笔记:MambaOut: Do We Really Need Mamba for Vision?

论文阅读笔记&#xff1a;MambaOut: Do We Really Need Mamba for Vision? 1 背景2 创新点3 方法4 模块4.1 Mamba适合什么任务4.2 视觉识别任务是否有很长的序列4.3 视觉任务是否需要因果token混合模式4.4 关于Mamba对于视觉的必要性假设 5 效果 论文&#xff1a;https://arxi…

games101-(3/4)变换

缩放&#xff1a; 对称 切变 旋转 考虑&#xff08;1.0&#xff09;这个点 同理考虑&#xff08;0&#xff0c;1&#xff09;点即可 齐次方程 考虑在二维的坐标点后面增加一个维度 所有的仿射变换都可以写成齐次坐标的形式 a b c d 是线性变换 tx ty 是平移&#xff1b; …

【Linux】磁盘

没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器&#xff1a;负责告诉磁盘是读还是写。 数据寄存器&#xff1a;给…

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档&#xff1f;文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES&#xff0c;最近在检索资料的时候翻阅到了 ES 的官方文档&#xff0c;里面对 ES 的基础与案例进行了通俗易懂的解释&#xff0c;读下来也有不少收获&#xff0…

海浪波高预测(背景调研)

#新星杯14天创作挑战营第7期# ps&#xff1a;图片由通义千问生成 历史工作&#xff1a; 针对更高细粒度、更高精度的波浪高度预测任务&#xff1a; Mumtaz Ali 等人提出了一种多元线性回归模型&#xff08;MLR-CWLS&#xff09;&#xff0c;该模型利用协方差加权最小二乘法&a…

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…

产业园管理系统提升企业综合管理效率与智能化水平的成功案例分析

内容概要 在当前科技迅猛发展的时代&#xff0c;越来越多的企业意识到数字化转型的重要性。为了提升管理效率和智能化水平&#xff0c;产业园管理系统应运而生&#xff0c;成为众多园区和商办写字楼不可或缺的一部分。无论是工业园、物流园还是公寓&#xff0c;这些系统都能为…

LeetCode - #195 Swift 实现打印文件中的第十行

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

强化学习数学原理(三)——值迭代

一、值迭代过程 上面是贝尔曼最优公式&#xff0c;之前我们说过&#xff0c;f(v)v&#xff0c;贝尔曼公式是满足contraction mapping theorem的&#xff0c;能够求解除它最优的策略和最优的state value&#xff0c;我们需要通过一个最优v*&#xff0c;这个v*来计算状态pi*&…

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚&#xff0c;DeepSeek正式发布了全新的推理模型DeepSeek-R1&#xff0c;引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色&#xff0c;性能对标OpenAI的o1正式版。同时&#xff0c;DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

scratch变魔术 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch变魔术 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、py…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算

【0】基础定义 按位与运算&#xff1a;全1取1&#xff0c;其余取0。按位或运算&#xff1a;全0取0&#xff0c;其余取1。 【1】引言 前序学习进程中&#xff0c;已经对图像按位与计算进行了详细探究&#xff0c;相关文章链接如下&#xff1a; python学opencv|读取图像&…

蓝桥杯省一

四个月从c&#xff0c;cpp&#xff0c;算法一起学到省一&#xff08;考研原因没参加国赛&#xff09; 有疑问可以关注私信哦 帖子后续也会持续更新&#xff0c;分享算法竞赛&#xff08;ccpc&#xff0c;天梯赛&#xff0c;蓝桥杯&#xff0c;浙大pta&#xff09;相关知识

C++ 新特性实现 ThreadPool

序言 在之前我们实现过线程池&#xff0c;但是非常基础。答题思路就是实现一个安全的队列&#xff0c;再通过 ThreadPool 来管理队列和线程&#xff0c;对外提供一个接口放入需要执行的函数&#xff0c;但是这个函数是无参无返回值的。  参数的问题我们可以使用 bind 来封装&a…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现&#xff0c;详见下文&#xff1a; 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现&#xff0c;其形参均采用了…

本地Harbor仓库搭建流程

Harbor仓库搭建流程 本文主要介绍如何搭建harbor仓库&#xff0c;推送本地镜像供其他机器拉取构建服务 harbor文档&#xff1a;Harbor 文档 | 配置 Harbor YML 文件 - Harbor 中文 github下载离线安装包 Releases goharbor/harbor 这是harbor的GitHub下载地址&#xff0c…