Golangchannel关闭与循环读取示例

关闭channel由发送方执行,使用close()函数,接收方不应关闭;关闭后可读取剩余数据,随后返回零值,向已关闭channel发送数据会引发panic。

golangchannel关闭与循环读取示例

在Go语言中,channel 是实现goroutine之间通信的重要机制。理解如何正确关闭 channel 以及如何安全地循环读取数据,是编写健壮并发程序的关键。

关闭Channel的规则

关闭 channel 表示不再有值发送到该 channel。尝试向已关闭的 channel 发送数据会引发 panic,而从已关闭的 channel 读取仍可进行,会依次返回剩余数据,之后返回零值。

通常由发送方负责关闭 channel,接收方不应关闭它。使用 close() 函数来关闭 channel:

ch := make(chan int, 3)ch <- 1ch <- 2close(ch)

使用for-range循环读取channel

for-range 可以自动检测 channel 是否关闭。当 channel 关闭且所有数据被读取后,循环自动退出。

立即学习“go语言免费学习笔记(深入)”;

示例:启动一个goroutine发送数据并关闭channel,主函数用range读取:

Shakker Shakker

多功能AI图像生成和编辑平台

Shakker 103 查看详情 Shakker

func main() {    ch := make(chan string, 2)
go func() {    ch <- "Hello"    ch <- "World"    close(ch) // 发送完成后关闭}()for msg := range ch {    fmt.Println(msg)}// 输出:// Hello// World

}

通过逗号ok模式判断channel状态

如果不想使用 range,可以用 <-chan 配合 ok 判断是否关闭:

for {    if msg, ok := <-ch; ok {        fmt.Println(msg)    } else {        fmt.Println("Channel closed")        break    }}

实际应用场景:任务分发与结果收集

常见模式:多个worker从同一个channel读取任务,主程序关闭任务channel后等待结果。

func main() {    tasks := make(chan int, 10)    results := make(chan int, 10)
// 启动workerfor w := 0; w < 3; w++ {    go func() {        for task := range tasks {            results <- task * 2        }    }()}// 发送任务for i := 1; i <= 5; i++ {    tasks <- i}close(tasks) // 所有任务发送完毕,关闭// 收集结果for i := 0; i < 5; i++ {    fmt.Println(<-results)}close(results)

}

基本上就这些。关键是记住:只由发送者关闭,接收者通过 range 或 ok 模式安全读取。避免重复关闭或向关闭的 channel 发送数据。

以上就是Golangchannel关闭与循环读取示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1137420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 18:04:19
下一篇 2025年12月2日 18:04:40

相关推荐

  • gRPC客户端工具:grpcui与grpcurl的实用指南

    本文针对.NET gRPC服务开发中遇到的客户端测试挑战,提供了实用的解决方案。详细介绍了两款强大的gRPC客户端工具:基于命令行的grpcurl和基于Web界面的grpcui。通过深入解析它们的安装、基本用法及核心功能,帮助开发者高效地进行gRPC服务发现、方法调用和调试,从而克服传统HTTP客户…

    2025年12月10日
    000
  • gRPC服务调试利器:grpcui与grpcurl实践指南

    本文旨在为gRPC服务开发者提供有效的调试与交互工具解决方案。针对传统HTTP客户端在gRPC协议上的局限性,重点介绍两款功能强大的开源工具:命令行界面的grpcurl和基于Web的交互式UI工具grpcui。文章将详细阐述它们的安装、基本用法、高级功能以及各自的适用场景,帮助开发者高效地测试、调试…

    2025年12月10日
    000
  • gRPC客户端选择与实践:grpcui与grpcurl深度解析

    在gRPC服务开发与调试中,选择合适的客户端工具至关重要。本文针对传统工具在gRPC场景下的局限性,重点介绍并推荐两款高效的gRPC客户端:基于命令行的grpcurl和提供Web界面的grpcui。它们凭借强大的服务发现、请求构建与响应可视化能力,极大简化了gRPC服务的测试与交互过程,是.NET及…

    2025年12月10日
    000
  • 探索高效gRPC客户端:grpcui与grpcurl实践

    本文旨在为gRPC服务开发者提供一套高效的客户端工具解决方案。针对传统HTTP客户端在gRPC测试中的局限性,我们重点介绍并指导如何使用grpcurl和grpcui这两款强大的工具。grpcurl作为命令行工具,提供灵活的gRPC服务调用能力;而grpcui则在此基础上提供直观的Web界面,极大简化…

    2025年12月10日
    000
  • gRPC服务调试利器:探索grpcui与grpcurl客户端

    本文旨在解决gRPC服务调试中遇到的挑战,特别是传统HTTP工具的局限性。我们将深入介绍两款高效的gRPC客户端工具:命令行界面的grpcurl和基于Web界面的grpcui。文章将详细阐述它们的安装、基本用法、核心功能以及在实际开发中的应用,旨在帮助开发者更便捷、专业地测试和调试gRPC服务。 引…

    2025年12月10日
    000
  • PHP如何开发在线咨询平台?即时通讯收费模式

    解决方案是采用php框架(如laravel)结合swoole/workerman/ratchet实现websocket实时通讯,前端使用vue/react构建spa,通过redis pub/sub解耦消息处理,mysql/postgresql存储数据;2. 即时通讯技术选型核心为websocket,…

    2025年12月10日
    000
  • PHP如何调用Terser压缩 Terser代码压缩调用技巧分享

    php调用terser压缩javascript的关键在于利用shell执行命令,需先安装node.js和terser。1. 安装node.js并使用npm全局安装terser;2. php中使用shell_exec或exec函数调用terser命令压缩代码,推荐通过临时文件传递内容以提升安全性;3.…

    2025年12月10日 好文分享
    000
  • PHP微服务架构:基础概念解析

    php微服务架构通过将大型应用拆分为独立服务提升可伸缩性与灵活性。其核心优势包括快速开发与迭代、易于部署扩展、技术栈灵活及低耦合性。但需应对服务发现、分布式事务等挑战。选择框架时,1.swoole适合高性能需求但学习曲线陡峭;2.roadrunner性能优异且支持多框架;3.symfony micr…

    2025年12月10日 好文分享
    000
  • PHP如何调用Go语言程序 调用Go程序的3种交互方式

    php调用go程序有三种方式:命令行调用、http服务和使用扩展。1. 命令行调用是通过exec等函数执行go可执行文件,优点是实现简单,适合非频繁调用;缺点是每次调用都要启动新进程,效率低。2. http服务是让go作为服务器接收php的http请求,优点是并发性能好,数据交换方便;缺点是需编写g…

    2025年12月10日 好文分享
    000
  • PHP物联网:设备连接实践

    php在物联网领域虽非首选,但可通过合理方案实现可靠应用。首先,php连接设备依赖消息队列(如rabbitmq或mosquitto)和restful api;其次,协议选择上,mqtt因轻量、稳定被推荐;第三,处理高并发需结合消息队列、swoole协程、缓存及负载均衡;第四,数据安全应通过设备认证、…

    2025年12月10日 好文分享
    000
  • PHP中的微服务:如何构建分布式应用

    php构建微服务的核心在于拆分单体应用为自治服务单元,以提升灵活性、可伸缩性与容错性,但需应对服务发现、通信、监控等复杂性。1. 服务拆分应基于业务领域(如用户管理、订单处理)并避免“上帝服务”;2. 框架选择推荐swoole(高性能)、roadrunner(企业级)、hyperf(协程支持);3.…

    2025年12月10日 好文分享
    000
  • PHP中的多线程处理:如何在PHP中实现多线程操作

    %ignore_a_1%本身不支持原生多线程,但在特定环境下可通过多种方式实现并发处理:1. pthreads扩展适用于cli环境,支持线程创建与管理,但需zts编译且不适用于web服务器模块;2. pcntl_fork可在unix系统中创建子进程实现并发,适合后台任务但资源占用较高;3. reac…

    2025年12月10日
    000
  • PHP7.4协程实现:基于Parallel多线程扩展

    在php7.4中,如何利用parallel多线程扩展实现协程?答案是通过parallel扩展创建多个线程,并在这些线程中运行协程。具体步骤包括:1.创建runtime对象;2.使用run方法启动协程;3.通过value方法获取协程返回值。 引言 在PHP7.4中,协程的实现为开发者提供了一种高效处理…

    2025年12月10日
    000
  • 从PHP转Go还是前端?过来人的建议与现实困惑

    PHP工程师的职业发展困境与选择 现状与困扰 最近我发现公司其他岗位(例如Android和嵌入式C)的同事薪资普遍高于PHP和前端工程师,即使他们的入职时间更晚。与领导沟通后,得到的回应是“PHP薪资确实较低”。这让我反思自身职业发展。我们PHP团队承担了公司大部分业务,工作量大,经常加班,不仅负责…

    2025年12月10日
    000
  • Go语言如何获取结构体的所有方法?

    Go语言不像PHP那样直接提供获取结构体所有方法的函数。然而,我们可以利用Go语言强大的反射机制(reflect包)来实现类似的功能。本文将演示如何使用反射来遍历并获取Go结构体的所有方法。 与PHP的get_class_methods不同,Go语言的反射需要更细致的操作。我们不能直接获取所有方法的…

    2025年12月10日
    000
  • 作为PHP开发者,是转向Go语言还是前端开发?过来人的建议与分析

    PHP开发者职业发展:Go还是前端?过来人经验分享 近期,我发现公司内部不同技术岗位的薪资差异较大,这促使我重新思考职业发展方向。作为一名资深的PHP后端工程师,我的薪资却低于入职时间较短的Android和嵌入式C工程师,这让我感到些许困惑。尽管我们PHP团队承担了公司大部分业务,经常加班,甚至兼顾…

    2025年12月10日
    000
  • 不同编程语言的运行时机制有何区别?

    深入探究编程语言的运行时机制:编译型、解释型及运行时库的差异 学习不同编程语言时,“运行时”是一个经常遇到的概念。它究竟是什么?Java、Go、Rust、Python和C等语言的运行时机制有何不同? 并非所有语言都严格意义上“拥有”运行时,更准确地说,所有语言的执行都依赖特定的运行环境。 将所有语言…

    2025年12月10日
    000
  • Java、Go、Rust、Python以及C语言的运行时机制究竟是什么?

    深入探究编程语言的运行时环境 学习编程语言时,“运行时”是一个经常遇到的概念,但其内涵却常常被误解。 它并非简单的“存在”或“不存在”,而是一个更广泛的概念,指程序运行时所依赖的全部环境和资源,涵盖内存管理、垃圾回收、线程管理、以及标准库等。 将编程语言简单地分为解释型和编译型,并以此否定运行时机制…

    2025年12月10日
    000
  • Python协程锁是如何实现的?它与其他语言的协程锁实现有何区别?

    深入探究Python协程锁的运行原理 本文将深入剖析Python协程锁的底层实现,并与其他编程语言(如Java、Golang)的协程锁机制进行对比分析,重点关注asyncio库中的锁机制,并扩展到更广泛的协程锁实现原理。 Python的asyncio库提供了一套协程同步原语,包括Lock、Event…

    2025年12月10日
    000
  • 从PHP转Go还是转前端?过来人的建议与职业规划思考

    PHP程序员的职业发展迷茫:Go还是前端? 近期,我发现公司其他部门(如Android、嵌入式C)的薪资明显高于PHP和前端开发人员,这引发了我的职业发展思考。PHP开发工作量大,责任重,但薪资回报却相对较低,这让我开始考虑职业转型。 Go语言:高薪诱惑与潜在挑战 一位转行Go的同事分享了他的高薪经…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信