Go语言---select

select的作用

Go 里面提供了一个关键字 select,通过 select 可以监听 channel上的数据流动。
select 的用法与switch 语言非常类似,由 select 开始一个新的选择块,每个选择条件由 case语句来描述。
与 switch 语句可以选择任何可使用相等比较的条件相比, select 有比较多的限制,其中最大的一条限制就是每个 case 语句里必须是一个 IO 操作,大致的结构如下:
在这里插入图片描述
在一个 select 语句中,Go语言会按顺序从头至尾评估每一个发送和接收的语句。
如果其中的任意一语句可以继续执行(即没有被阻塞),那么就从那些可以执行的语句中任意选择一条来使用。
如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有两种可能的情况:如果给出了 * default 语句,那么就会执行 default 语句,同时程序的执行会从 select 语句后的语句中恢复。

  • 如果没有 default 语句,那么 select 语句将被阻塞,直到至少有一个通信可以进行下去。

利用select实现fibonacci

package mainimport ("fmt"
)// ch只写,quit只读
func fibonacci(ch chan<- int, quit <-chan bool) {x, y := 1, 1for {select {case ch <- x:x, y = y, x+ycase flag := <-quit:fmt.Println("flag=", flag)return}}
}
func main() {ch := make(chan int)    //数字通信quit := make(chan bool) //程序是否结束//消费者go func() {for i := 0; i < 8; i++ {num := <-chfmt.Println(num)}//可以停止quit <- true}()//生产者fibonacci(ch, quit)
}

在这里插入图片描述

  • ch控制着读写的进行。

select实现超时

有时候会出现 goroutine 阻塞的情况,那么我们如何避免整个程序进入阻塞的情况呢?我们可以利用 select 来设置超时,通过如下的方式实现:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark底层原理:案例解析(第34天)

系列文章目录 一、Spark架构设计概述 二、Spark核心组件 三、Spark架构设计举例分析 四、Job调度流程详解 五、Spark交互流程详解 文章目录 系列文章目录前言一、Spark架构设计概述1. 集群资源管理器&#xff08;Cluster Manager&#xff09;2. 工作节点&#xff08;Worker No…

从汇编层看64位程序运行——栈帧(Stack Frame)边界

大纲 RBP&#xff0c;RSP栈帧边界总结参考资料 在《从汇编层看64位程序运行——栈帧(Stack Frame)入门》中&#xff0c;我们简单介绍了栈帧的概念&#xff0c;以及它和函数调用之间的关系。如文中所述&#xff0c;栈帧是一种虚拟的概念&#xff0c;它表达了一个执行中的函数的栈…

如何找回误删的文件?4个常用文件恢复方法!

对于许多用户来说&#xff0c;误删文件是一种常见而令人懊恼的情况。恢复误删文件的重要性在于&#xff0c;它可以帮助用户找回宝贵的数据&#xff0c;避免因数据丢失带来的各种不便和损失。 如何找回不小心删除的文件&#xff1f; 误删数据不知道怎么恢复&#xff0c;会给我…

kafka部署以及常用命令详细总结

1环境准备 1.1ip规划 ip: 192.168.1.200 1.2配置主机名 #设置主机名 hostnamectl set-hostname node11.3配置hosts [rootnode1 ~]# cat >> /etc/hosts << EOF192.168.1.200 node1 EOF2部署 2.1安装包准备 将以下安装包从官网下载到本地 jdk-8u371-linux-x6…

如何使用键盘优雅地使用浏览器

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 目录 浏览器快捷键 参考资料&#xff1a; 教你如何用键盘轻松浏览网页 这两天出门旅游&#xff0c;高铁…

Vue单路由的独享守卫怎么设置

在Vue.js中&#xff0c;特别是在使用Vue Router时&#xff0c;路由守卫&#xff08;Route Guards&#xff09;是一种强大的机制&#xff0c;允许我们在路由发生变化时执行一些逻辑&#xff0c;比如检查用户是否登录、加载数据等。Vue Router提供了全局守卫、路由独享守卫和组件…

美团一面,你碰到过CPU 100%的情况吗?你是怎么处理的?

本文主要分为三部分 分析一下CPU 100%的常见原因 CPU 100%如何排查 回答这个问题的一个参考答案 CPU被打满的常见原因 1. 死循环 在实际工作中&#xff0c;可能每个开发都写过死循环的代码。 死循环有两种&#xff1a; 在 while、for、forEach 循环中的死循环。 无限递…

centos安装minio文件系统服务器(踩坑版)

centos安装minio文件系统服务器&#xff08;踩坑版&#xff09; 引安装1. 下载2. 启动3. 创建access keys4. 创建buckets 坑 引 本来安装挺简单的&#xff0c;网上的教程一大堆&#xff0c;有些写的也挺详细的。不过自己还是踩到坑了&#xff0c;耽误了个把小时&#xff0c;特…

【分库】分库的核心原则

目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时&#xff0c;遵循一系列核心原则是至关重要的&#xff0c;以确保系统不仅能够在当前规模下高效运行&#xff0c;还能够随着…

Vue的生命周期函数有哪些?

Vue的生命周期函数是指Vue实例从创建到销毁的过程中&#xff0c;会调用的一系列特殊函数&#xff0c;这些函数允许开发者在Vue的不同阶段执行特定的代码。Vue 2.x和Vue 3.x的生命周期函数有所差异&#xff0c;但总体思路是一致的。以下是Vue生命周期函数的主要分类和具体函数&a…

单目测距 单目相机测距 图片像素坐标转实际坐标的一种转换方案

需要相机位置固定 原图 红色的点是我们标注的像素点&#xff0c;这些红色的点我们知道它的像素坐标&#xff0c;以及以右下角相机位置为原点的x y 实际坐标数值 通过转换&#xff0c;可以得到整个图片内部其余像素点的实际坐标&#xff0c; 这些红色的点是通过转换关系生成的&…

Python | Leetcode Python题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; class Solution:BIG 2**30def isPowerOfTwo(self, n: int) -> bool:return n > 0 and Solution.BIG % n 0

el-table 动态添加删除 -- 鼠标移入移出显隐删除图标

<el-table class"list-box" :data"replaceDataList" border><el-table-column label"原始值" prop"original" align"center" ><template slot-scope"scope"><div mouseenter"showClick…

小妙招使用sysctl hw.realmem查看实际物理内存@FreeBSD

使用sysctl hw.realmem查看实际物理内存&#xff1a;The realmem value is memory before the kernel and modules are loaded, whereas hw.physmem is what is left after they were loaded. 使用hw.physmem查看去掉kernel和模块调用后剩余的内存 sysctl hw.ncpu是机器的cpu…

Java三剑客:封装、继承、多态的魔法世界

第一章&#xff1a;封装的艺术 —— 保护你的宝藏 案例分析&#xff1a;银行账户系统 想象一下&#xff0c;你正在构建一个银行账户系统。每个账户都有一个余额&#xff0c;这个余额需要受到严格的保护&#xff0c;不能被随意修改。我们可以通过封装来实现这一目标。 示例代…

Sentinel和hystric的运用详解

Hystrix是一个由Netflix开发的开源Java库&#xff0c;用于实现延迟容忍和容错逻辑&#xff0c;以增强分布式服务之间的交互的弹性。Hystrix通过隔离服务之间的访问点&#xff0c;阻止级联故障&#xff0c;并提供后备选项来实现这一目标。Hystrix的核心功能包括服务降级、服务熔…

nvide shortcuts table

快捷键中文功能描述n nvim-tree: 打开预览n nvim-tree: 打开n -nvim-tree: 上一级目录n .nvim-tree: 运行命令n <nvim-tree: 上一个同级节点n >nvim-tree: 下一个同级节点n Bnvim-tree: 切换过滤器&#xff1a;无缓冲区n Cnvim-tree: 切换过滤器&#xff1a;Git 干净n Dn…

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的 JavaScript 和 XML AJAX 不是新的编程语言&#xff0c;指的是⼀种交互方式&#xff1a;异步加载。 客户端和服务器的数据交互更新在局部页面的技术&#xff0c;不需要刷新…

Openerstry + lua + redis根据请求参数实现动态路由转发

文章目录 一、需求分析二、准备1、软件安装2、redis-lua封装优化 三、实现1、nginx.conf2、dynamic.lua注意 3、准备两个应用4、访问nginx 一、需求分析 根据用户访问url的参数&#xff0c;将请求转发到对应指定IP的服务器上。 二、准备 1、软件安装 安装openrestyredis&am…

Database数据库 vs Data Warehouse数据仓库 vs Data Mart数据集市 vs Data Lake数据湖

1.DATABASE 数据库 数据库是一个结构化的数据集合&#xff0c;用于存储、管理和检索数据。数据库设计用于支持事务处理&#xff08;OLTP&#xff0c;Online Transaction Processing&#xff09;和日常操作。 数据库通常由数据库管理系统&#xff08;DBMS&#xff09;控制&…