【Go - 每日一小问: 对已经关闭的的 chan 进行读写,会怎么样?为什么?】

2024-08-27 02:28

本文主要是介绍【Go - 每日一小问: 对已经关闭的的 chan 进行读写,会怎么样?为什么?】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对已经关闭的 chan 进行读写会有不同的行为:

1. 对已关闭的 chan 进行读取

  • 读取操作
    • 如果 chan 中有未被读取的值,可以继续读取这些值,直到 chan 中的所有值都被读取完。
    • 一旦 chan 中的所有值都被读取完,再次读取时会立即返回零值(zero value)并且不会阻塞。
    • 读取操作可以通过第二个返回值来判断 chan 是否已关闭。
package mainimport ("fmt"
)func main() {ch := make(chan int, 2)ch <- 1ch <- 2close(ch)// 读取已关闭的 chanfor i := 0; i < 3; i++ {val, ok := <-chfmt.Printf("val: %d, ok: %v\\n", val, ok)}
}

输出:

val: 1, ok: true
val: 2, ok: true
val: 0, ok: false

2. 对已关闭的 chan 进行写入

  • 写入操作
    • 对已关闭的 chan 进行写入操作会导致运行时(panic)。
    • 这是因为关闭的 chan 不允许再写入任何值。
package mainfunc main() {ch := make(chan int, 2)close(ch)// 对已关闭的 chan 进行写入ch <- 1 // 这行代码会导致 panic
}

运行时会出现以下错误:

panic: send on closed channel

为什么会这样?

  • 读取操作
    • 设计上,读取已关闭的 chan 返回零值并且不会阻塞,这样可以让消费者知道 chan 已经关闭,并且可以继续处理剩余的值。
    • 通过第二个返回值 ok,可以判断 chan 是否已关闭,从而避免误读。
  • 写入操作
    • 设计上,关闭的 chan 不允许再写入任何值,以确保数据的一致性和完整性。
    • 试图向已关闭的 chan 写入数据会导致运行时panic,以便开发者能够及时发现和修复这种错误。

总结

  • 对已关闭的 chan 进行读取操作会返回零值并且不会阻塞,可以通过第二个返回值判断 chan 是否已关闭。
  • 对已关闭的 chan 进行写入操作会导致运行时(panic)。
  • 这种设计确保了数据的一致性和程序的健壮性。

这篇关于【Go - 每日一小问: 对已经关闭的的 chan 进行读写,会怎么样?为什么?】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110371

相关文章

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数