go select 使用总结
转载请注明出处:
在Go语言中,select语句用于处理多个通道的并发操作。它类似于switch语句,但是select语句用于通信操作,而不是条件判断。select语句会同时监听多个通道的操作,并选择其中一个可用的通道进行操作。 select语句的语法如下:
select {
case <-channel1:
// 执行channel1的操作
case data := <-channel2:
// 执行channel2的操作,同时将通道中的数据赋值给data变量
case channel3 <- data:
// 将data写入channel3
default:
// 当没有任何通道操作时执行default语句
}
select语句中可以包含多个case子句,每个case子句表示一个通道操作。<-符号用于从通道中读取数据,channel <- data用于将数据写入通道。 select语句的执行流程为:
如果有多个通道都可以操作,则随机选择一个进行操作。
如果没有任何通道可以操作,则会执行
default语句(如果有)。如果没有
default语句,则select语句会阻塞,直到至少有一个通道可以操作。
下面是一个使用select语句的示例:
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(time.Second)
ch1 <- 1
}()
go func() {
time.Sleep(2 * time.Second)
ch2 <- 2
}()
select {
case data := <-ch1:
fmt.Println("收到ch1的数据:", data)
case data := <-ch2:
fmt.Println("收到ch2的数据:", data)
default:
fmt.Println("没有任何通道操作")
}
}
在上面的例子中,我们创建了两个通道ch1和ch2,并分别在不同的goroutine中向它们发送数据。然后使用select语句监听这两个通道的操作,当其中一个通道可用时,就会执行对应的case语句。
在这个例子中,由于ch1的数据发送操作会在1秒后执行,而ch2的数据发送操作会在2秒后执行,因此select语句会等待1秒后,执行ch1的case语句,输出"收到ch1的数据: 1"。如果我们将ch1的发送操作改为在2秒后执行,那么select语句将会等待2秒后,执行ch2的case语句,输出"收到ch2的数据: 2"。
需要注意的是,select语句的执行顺序是随机的,所以不能依赖于某个通道的操作先于其他通道。这也是使用select语句时需要注意的地方之一。
如果希望持续监听多个通道的操作,可以将select语句放在一个无限循环中。
package main
import (
"fmt"
"time"
)
func main() {
channel1 := make(chan int)
channel2 := make(chan string)
go func() {
for i := 0; i < 5; i++ {
time.Sleep(time.Second)
channel1 <- i
}
close(channel1)
}()
go func() {
for i := 0; i < 5; i++ {
time.Sleep(time.Second)
channel2 <- fmt.Sprintf("Message %d", i)
}
close(channel2)
}()
for {
select {
case data1, ok := <-channel1:
if ok {
fmt.Println("Received from channel1:", data1)
} else {
fmt.Println("Channel1 closed")
channel1 = nil
}
case data2, ok := <-channel2:
if ok {
fmt.Println("Received from channel2:", data2)
} else {
fmt.Println("Channel2 closed")
channel2 = nil
}
}
if channel1 == nil && channel2 == nil {
break
}
}
fmt.Println("Done")
}
在这个示例中,创建了两个通道channel1和channel2,分别用于发送不同类型的数据。然后分别启动两个goroutine,每个goroutine向对应的通道发送一些数据,然后关闭通道。其运行得结果如图:

在主函数中,我们使用无限循环和select语句来持续监听这两个通道的操作。每次循环时,select语句会选择其中一个可用的通道进行操作。如果通道关闭,我们会将对应的通道设置为nil,以便在后续的循环中跳过该通道的操作。当两个通道都关闭,即channel1和channel2都为nil时,我们跳出循环,程序结束。
运行上述代码,你会看到程序持续监听两个通道的操作,并打印接收到的数据,直到两个通道都关闭。最后,程序输出"Done"并结束。
go select 使用总结的更多相关文章
- 最全的ORACLE-SQL笔记
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...
- Matplotlib数据可视化(6):饼图与箱线图
In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- LINQ to SQL Select查询
1. 查询所有字段 using (NorthwindEntities context = new NorthwindEntities()) { var order = from n in contex ...
- ADO.NET一小记-select top 参数问题
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...
- iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果
具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- 基于select的python聊天室程序
python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...
随机推荐
- Java设计模式 —— 外观模式
13 外观模式 13.1 外观模式概述 Facade Pattern: 为子系统的接口提供一组统一的入口.外观模式定义了一个高层接口,这个接口使得子系统的更加容易使用. 在外观模式中,一个子系统的外部 ...
- MySQL主从复制原理剖析与应用实践
vivo 互联网服务器团队- Shang Yongxing MySQL Replication(主从复制)是指数据变化可以从一个MySQL Server被复制到另一个或多个MySQL Server上, ...
- SprintBoot2报错汇总
报错1:SpringBoot找不到bean Unable to start ServletWebServerApplicationContext due to missing ServletWebSe ...
- Springboot接入ChatGPT 续
在之前的文章\(^{[ 1 ]}\)中,原方案的设计,是基于功能实现的角度去设计的,对于功能性的拓展,考虑不全面,结合收到的反馈意见,对项目进行了拓展优化.完成的优化拓展有如下几个方面 固定会话 历史 ...
- ES的索引结构与算法解析
作者:京东物流 李洪吉 提到ES,大多数爱好者想到的都是搜索引擎,但是明确一点,ES不等同于搜索引擎.不管是谷歌.百度.必应.搜狗为代表的自然语言处理(NLP).爬虫.网页处理.大数据处理的全文搜索引 ...
- ray-分布式计算框架-集群与异步Job管理
0. ray 简介 ray是开源分布式计算框架,为并行处理提供计算层,用于扩展AI与Python应用程序,是ML工作负载统一工具包 Ray AI Runtime ML应用程序库集 Ray Core 通 ...
- error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file o
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file o ...
- RK3568用户自定义开机画面功能
RK方案中的开机画面处画逻辑 在RK的方案中,如RK1109,RK1126,RK3568这些嵌入式LINUX方案在开机画面的处理逻辑都是一致的. 用户的uboot,kernel开机画面都是同dts,k ...
- 新概念英语(New Concept English),前言
本书向读者提供了一套完整的,经过实践检验的英语学习体系,使得学生能够发挥自己的最大潜能. 听力 口语 阅读 写作 学习语言不在于掌握一套规则和积累大量词汇. 而在于如何运用所学的知识. 学习单词,必须 ...
- Prism Sample 12-UsingCompositeCommands
本例中,主页是一个按钮,绑定了一个复合命令,然后下面一个TabControl <Grid> <Grid.RowDefinitions> <RowDefinition He ...