【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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推