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

在Go语言中使用select和channel来期待确定性行为

        Go开发人员在使用channel时常犯的一个错误是,对select在多个channel中的行为方式做出错误的假设。错误的假设可能会导致难以识别和重现的细微错误。假设我们要实现一个需要从两个channel接收消息的goroutine:

        我们可能会决定像下面这样处理优先级:

for {select {case v := <-messageCh:fmt.Println(v)case <-disconnectCh:fmt.Println("disconnection, return")return}
}

        我们使用select从多个channel接收消息。因为我们想优先考虑messageCh,所以可以假设应该首先编写messageCh情况,然后再编写disconnectCh情况。但是这段代码真的有用吗?让我们通过编写一个发送10条消息然后发送断开连接通知的虚拟生产者goroutine来尝试一下:

for i := 0; i < 10; i++ {messageCh <- i
}
disconnectCh <- struct{}{}

运行这个例子,如果messageCh被缓冲,下面是一个可能的输出: 

0
1
2
3
4
disconnection, return

        我们只收到了其中的5条。这是什么原因呢?它依赖于具有多个channel的select语句的规范:

                

http://www.lryc.cn/news/336150.html

相关文章:

  • 【MATLAB源码-第19期】matlab基于导频的OFDM系统瑞利信道rayleigh的信道估计仿真,输出估计与未估计误码率对比图。
  • 坚持十天做完Python入门编程100题第三天加班
  • MSOLSpray:一款针对微软在线账号(AzureO365)的密码喷射与安全测试工具
  • uos安装lxml避坑记录
  • 518. 零钱兑换 II(力扣LeetCode)
  • 01串的熵(蓝桥杯)
  • Rust 基础语法和数据类型
  • 【Java SE】10 String类
  • web蓝桥杯真题:新鲜的蔬菜
  • 超声波清洗机能洗哪些东西?洗眼镜超声波清洗机推荐
  • [C++][算法基础]走迷宫(BFS)
  • C语言字符串左旋
  • Linux 中断会产生嵌套吗?
  • 嵌入式ARM版本银河麒麟操作系统V10SP1安装OPenGauss数据库
  • 深度学习八股文
  • jquery 自整理
  • MySQL | 加索引报错
  • 前端:自制年历
  • 9.手写JavaScript大数相加问题
  • FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现
  • 通过 CLI 和引入的方式使用 React:基础入门
  • 第三资本:铸就辉煌非凡的资历
  • 基于激光雷达的袋装水泥智能装车系统有哪些优势?
  • 实战自动化修改主机名
  • 无人机GB42590接收端 +接收端,同时支持2.4G与5.8G双频WIFI模组
  • PVE系统的安装
  • 一辆汽车的节拍时间是怎样的?
  • 数据结构-合并两个有效数组
  • 华为2024年校招实习硬件-结构工程师机试题(四套)
  • 使用Pandas解决问题:对比两列数据取最大值的五种方法