当前位置: 首页 > news >正文

【go从零单排】Closing Channels通道关闭、Range over Channels

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 语言中,通道(channel)的关闭是一个重要的概念,允许发送者通知接收者不再发送任何值。关闭通道可以帮助避免死锁,并使接收者能够知道何时所有数据都已被处理。

💻代码

通道关闭

package mainimport "fmt"func main() {jobs := make(chan int, 5) // 创建一个容量为 5 的整型通道 jobsdone := make(chan bool)   // 创建一个布尔类型的通道 done// 启动一个 goroutine 来处理 jobs 通道中的任务go func() {for {//从 jobs 通道接收任务。如果通道关闭且没有更多数据,more 将为 false。j, more := <-jobs // 尝试从 jobs 通道接收任务if more {         // 如果成功接收任务fmt.Println("received job", j)} else { // 如果通道已关闭且没有更多的任务fmt.Println("received all jobs")done <- true // 向 done 通道发送信号,表示所有任务已处理完成//主 goroutine 等待 goroutine 完成所有任务处理。当 goroutine 向 done 通道发送信号后,主 goroutine 将继续执行。return // 退出 goroutine}}}()// 向 jobs 通道发送任务for j := 1; j <= 3; j++ {jobs <- jfmt.Println("sent job", j)}close(jobs) // 关闭 jobs 通道,表示不再发送更多任务fmt.Println("sent all jobs")<-done // 等待 goroutine 完成所有任务// 尝试从 jobs 通道接收更多任务_, ok := <-jobsfmt.Println("received more jobs:", ok)
}
//输出
//sent job 1
//sent job 2
//sent job 3
//sent all jobs
//received job 1
//received job 2
//received job 3
//received all jobs
//received more jobs: false

🔍理解

  • go中关闭通道的语法:close(myChannel)
  • 一旦通道被关闭,任何后续的发送操作都会引发panic。
  • 只由发送者关闭通道:通常,只有发送通道的 goroutine 应该关闭通道。接收者不应该关闭通道,因为这可能会导致其他 goroutine 在尝试发送时发生panic。
  • 避免重复关闭:关闭已关闭的通道会导致恐慌,因此在关闭通道之前,确保它未被关闭
  • 使用 range 处理通道:使用 range 迭代通道可以简化关闭通道后的处理逻辑。
  • 从通道返回的第二个值为bool类型,通道开启时为true,通道关闭时为false

💡 Tips小知识点

如何检查通道是否关闭

value, ok := <-myChannel
if !ok {fmt.Println("Channel is closed")
}

通道关闭后的情况

package mainimport ("fmt"
)func main() {jobs := make(chan int)// 启动一个 goroutine 来处理 jobs 通道go func() {for j := range jobs { // 使用 range 迭代接收 jobs 通道的值fmt.Println("Processing job:", j)}fmt.Println("No more jobs, exiting goroutine.")}()// 发送一些任务for i := 1; i <= 5; i++ {jobs <- ifmt.Println("Sent job:", i)}close(jobs) // 关闭通道,表示不再发送任务fmt.Println("All jobs sent.")// 等待 goroutine 完成(在这个简单示例中,它会在接收完所有任务后自动退出)
}
//输出
//Processing job: 1
//Sent job: 1
//Sent job: 2
//Processing job: 2
//Processing job: 3
//Sent job: 3
//Sent job: 4
//Processing job: 4
//Processing job: 5
//Sent job: 5
//All jobs sent.

Range over Channels

使用 range 迭代通道是 Go 语言中处理通道的一种简洁且高效的方式。通过 range 语法,可以自动处理通道的关闭,简化了代码逻辑。

基本用法

package mainimport "fmt"func main() {//创建通道queue,buffer为2queue := make(chan string, 2)queue <- "one" //发送消息到通道queue <- "two"close(queue) //关闭通道for elem := range queue {fmt.Println(elem)}
}//输出
//one
//two

使用range处理通道的好处

  • 使用 range 迭代通道时,Go 会持续从通道中接收值,直到通道被关闭为止。
  • 当通道关闭后,range 循环会自动结束,而不会引发panic
  • 在关闭通道后,所有未被读取的值都会被处理完,然后循环自动退出
  • 无需手动检查通道状态:使用 range 可以避免手动检查通道是否关闭或是否还有值,这样可以减少代码的复杂性。
  • 避免死锁风险:在处理通道时,手动检查通道状态可能导致逻辑错误,使用 range 可以有效避免这类问题。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述

相关文章:

【go从零单排】Closing Channels通道关闭、Range over Channels

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;通道&#xff08;channel&#xff09;的关闭是一个重要…...

初始JavaEE篇 —— 文件操作与IO

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 文件介绍 Java标准库中提供操作文件的类 文件系统操作 File类的介绍 File类的使用 文件内容操作 二进制文件的读写操作…...

GitLab实现 HTTP 访问和 SMTP 邮件发送

GitLab实现 HTTP 访问和 SMTP 邮件发送 本教程详细记录了如何配置 SMTP 邮件通知、实现外网 HTTP 访问&#xff0c;并分享在配置过程中遇到的问题及解决方法。 一、准备工作 安装 Docker&#xff1a;确保在 Synology NAS 上安装 Docker 应用。下载 GitLab 镜像&#xff1a;在…...

HarmonyOS ArkTS 下拉列表组件

Entry Component struct Index {defaultValue: string 下拉列表;// 定义选项数组&#xff0c;包含 value 和可选的 labeloptions: Array<SelectOption> [{ value: aaa },{ value: bbb },{ value: ccc },{ value: ddd },{ value: eee },{ value: fff },{ value: ggg },{…...

zabbix监控Linux系统

1. zabbix agent安装 #sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpm #sudo dnf clean all #yum install zabbix-agent -y Running transaction test Transaction test succeeded. Running transactionPreparing …...

线性表-数组描述补充 迭代器(C++)

补充线性表数组实现的迭代器部分 知识点&#xff1a; typedef是C语言中的一个关键字&#xff0c;它的主要作用是为一种数据类型定义一个新的名字&#xff08;别名&#xff09;。 在 C 的 STL&#xff08;Standard Template Library&#xff09;中&#xff0c;迭代器是连接容…...

vue3 + element-plus 的 upload + axios + django 文件上传并保存

之前在网上搜了好多教程&#xff0c;一直没有找到合适自己的&#xff0c;要么只有前端部分没有后端&#xff0c;要么就是写的不是很明白。所以还得靠自己摸索出来后&#xff0c;来此记录一下整个过程。 其实就是不要用默认的 action&#xff0c;要手动实现上传方式 http-reque…...

dm 创建数据库实例【window】

参考链接&#xff1a;配置实例 1&#xff09;打开 DM 数据库配置助手 2&#xff09;按照默认的进行 字符串大小写敏感&#xff1a;譬如 mysql 默认是大小写不敏感&#xff0c;如果在迁移中还选择了 保持对象大小写&#xff0c;那么就会出现一种情况就是每次查询等带有表名的都…...

Docker实践与应用举例:从入门到进阶

Docker实践与应用举例&#xff1a;从入门到进阶 在云计算和微服务架构日益盛行的今天&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;凭借其高效、灵活、可移植的特点&#xff0c;迅速成为了开发和运维团队的首选工具。本文将通过深入浅出的方式&#xff0c;探讨Do…...

【LeetCode】【算法】560. 和为 K 的子数组

LeetCode 560. 和为 K 的子数组 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 思路 思路&#xff1a;前缀和 定义数组preSum[nums.length1]&#xff0c;在里面计算nums…...

Webots控制器编程

本文主要内容是如何编写Webots控制器&#xff0c;使用语言为Python。 文章目录 1. 新增控制器2. Hello World Example3. 读取传感器4. 使用执行器5. 理解step和robot.step函数6. 同时使用传感器和执行器7. 控制器参数 1. 新增控制器 对机器人Robot新增控制器的方式&#xff1…...

舷外机,高效动力的选择,可靠性能的保障_鼎跃安全

舷外机是现代船只动力系统中的核心设备&#xff0c;广泛应用于娱乐船、渔船、巡逻船、救援船等多种场景。它不仅提供船只的动力支持&#xff0c;还因其结构简便、操作灵活和维护方便&#xff0c;成为水上作业的重要组成部分。 一、舷外机的功能作用 1. 强劲动力源 舷外机是船…...

计算机新手练级攻略——如何搜索问题

目录 计算机学生新手练级攻略——如何搜索问题1.明确搜索意图2.使用精确关键词3.使用专业引擎搜索4.利用好技术社区1. Stack Overflow2. GitHub3. IEEE Xplore4. DBLP 5.使用代码搜索工具1. GitHub 代码搜索2. Stack Overflow 代码搜索3. Papers with Code4. IEEE Xplore 6.查阅…...

echarts-gl 3D柱状图配置

1. 源码 此demo可以直接在echarts的编辑器中运行 option {title: {text: 产量图,textStyle: {color: rgba(255, 255, 255, 1),fontSize: 17},left: center},tooltip: {},legend: {show: false,orient: vertical,x: left,top: 0,right: 20,textStyle: {fontSize: 12}},visualM…...

设计模式之模版方法模式(Template)

一、模版方法模式介绍 1、模版方法模式定义&#xff1a; 模板方法模式(template method pattern)原始定义是&#xff1a;在操作中定义算法的框架&#xff0c;将一些 步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理…...

背包九讲——背包问题求具体方案

目录 背包问题求具体方案 1. 01 背包问题 题目&#xff1a;12. 背包问题求具体方案 - AcWing题库 算法思路&#xff1a; 代码实现&#xff1a; 2. 多重背包问题 算法思路&#xff1a; 3. 完全背包问题 算法思路&#xff1a; 代码实现&#xff1a; 背包问题第九讲—…...

Python http打印(http打印body)flask demo(http调试demo、http demo、http printer)

文章目录 代码解释 代码 # flask_http_printer.pyfrom flask import Flask, request, jsonify import jsonapp Flask(__name__)app.route(/printinfo, methods[POST]) def print_info():# 分隔符separator "-" * 60# 获取请求头headers request.headers# 获取 JS…...

JSF HTML标签教程一口气讲完!(下)

JSF OutputScript示例 JSF教程 - JSF OutputScript示例 h:outputScript标记渲染类型为“script"的HTML元素&#xff0c;类型为“text/javascript"。 此标记将外部JavaScript文件添加到JSF页面。 以下JSF标记 <h:outputScript library"js" name"…...

cmake报错The link interface of target “gRPC::grpc“ contains: OpenSSL::SSL 解决

系统环境&#xff1a;麒麟V10 报错描述&#xff1a; The link interface of target "gRPC::grpc" contains: OpenSSL::SSL but the target was not found. Possible reasons include: * There is a typo in the target name. * A find_package call is missing fo…...

C语言PythonBash:空白(空格、水平制表符、换行符)与转义字符

C语言 空白 C语言中的空白&#xff08;空格、水平制表符、换行符&#xff09;被用于分隔Token&#xff0c;因此Token间可以有任意多个空白。 // 例1 printf("Hello, World!"); 例1中存在5个Token&#xff0c;分别是&#xff1a; printf("Hello, World! \n&qu…...

贝叶斯网络中条件独立性的判断 CS188 Note13 学习笔记

更好的阅读体验 D-Separation D-separation 是贝叶斯网络中的一个概念&#xff0c;用于通过图结构DAG随机变量之间的条件独立性 首先需要回顾一下的是&#xff1a;在图中&#xff0c;只要给定了某个节点的所有父节点&#xff0c;那么该节点就与其所有祖先节点在逻辑上是相互独…...

阴阳师自动化脚本终极指南:一键解放双手,轻松享受游戏乐趣

阴阳师自动化脚本终极指南&#xff1a;一键解放双手&#xff0c;轻松享受游戏乐趣 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为阴阳师里那些重复繁琐的日常任务烦恼吗&…...

医疗AI模型窃取攻击:原理、风险与超声影像场景的防御实践

1. 项目概述&#xff1a;当医疗AI的“大脑”面临被“复制”的风险在医疗影像领域&#xff0c;尤其是超声诊断&#xff0c;深度学习模型正以前所未有的速度改变着临床实践。它能从看似杂乱的超声回波信号中&#xff0c;精准地量化肝脏脂肪含量、鉴别乳腺肿物的良恶性&#xff0c…...

艾尔登法环存档迁移终极指南:3步安全转移你的游戏角色

艾尔登法环存档迁移终极指南&#xff1a;3步安全转移你的游戏角色 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier EldenRingSaveCopier 是一款专为《艾尔登法环》玩家设计的存档角色迁移工具&#xff0c;能够…...

校准机器学习与SHAP分析:构建可信专利价值评估模型

1. 项目概述&#xff1a;从“黑盒”预测到“透明”评估的跨越在技术管理和投资决策领域&#xff0c;判断一项专利或技术的长期价值&#xff0c;一直是个既关键又棘手的难题。传统的专家评估方法虽然能结合行业洞见&#xff0c;但往往耗时费力、主观性强&#xff0c;且难以应对海…...

明日方舟自动化工具终极指南:Arknights-Mower 完整使用教程

明日方舟自动化工具终极指南&#xff1a;Arknights-Mower 完整使用教程 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 作为一款专为《明日方舟》玩家设计的开源自动化工具&#xff0c;Arknights…...

小微团队如何利用Taotoken管理多个项目的AI成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 小微团队如何利用Taotoken管理多个项目的AI成本 对于创业团队或小微企业而言&#xff0c;在拥抱大模型能力的同时&#xff0c;如何…...

如何在3分钟内将视频压缩90%?免费开源神器CompressO完全指南

如何在3分钟内将视频压缩90%&#xff1f;免费开源神器CompressO完全指南 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compr…...

企业内统一AI开发环境借助TaotokenCLI工具一键配置

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业内统一AI开发环境借助Taotoken CLI工具一键配置 在中大型企业的技术团队中&#xff0c;为所有开发者提供统一、标准化的AI服务…...

观察Taotoken在多模型间自动路由与容灾切换的实际响应情况

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken在多模型间自动路由与容灾切换的实际响应情况 在构建依赖大模型服务的应用时&#xff0c;服务的连续性与稳定性是开发…...