问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

golang select 什么都不写

发布网友 发布时间:2022-05-10 17:33

我来回答

2个回答

懂视网 时间:2022-05-10 21:55

这篇文章主要给大家介绍了关于Golang中switch和select的用法教程,文中通过示例代码将switch语句与select语句的使用方法介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。

本文主要给大家介绍了关于Golang中switch和select用法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

一、switch语句

switch语句提供了一个多分支条件执行的方法。每一个case可以携带一个表达式或一个类型说明符。前者又可被简称为case表达式。因此,Go语言的switch语句又分为表达式switch语句和类型switch语句。

1、表达式switch语句


var name string 
... 
switch name { 
case "Golang": 
 fmt.Println("Golang") 
case "Rust": 
 fmt.Println("Rust") 
default: 
 fmt.Println("PHP是世界上最好的语言") 
}

Go会依照从上至下的顺序对每一条case语句中case表达式进行求值,只要被发现其表达式与switch表达式的结果相同,该case语句就会被选中。其余的case语句会被忽略。 与if相同,switch语句还可以包含初始化字句,且其出现位置和写法如出一辙:


names := []string{"Golang","java","PHP"} 
switch name:=names[0];name { 
case "Golang": 
 fmt.Println("Golang") 
... 
default: 
 fmt.Println("Unknown") 
}

2、类型switch语句

类型switch语句与一般形式有两点差别。第一点,紧随case关键字的不是表达式,而是类型说明符。类型说明符由若干个类型字面量组成,且多个类型字面量之间由英文逗号分隔。第二点,它的switch表达式是非常特殊的。这种特殊的表达式也起到了类型断言的作用,但其表现形式很特殊,如:v.(type) , 其中v必须代表一个接口类型的值。该类表达式只能出现在类型switch语句中,且只能充当switch表达式。一个类型switch语句的示例如下:


v := 11 
switch i := interface{}(v).(type) { 
case int, int8, int16, int32, int64: 
 fmt.Println("A signed integer:%d. The type is %T. 
", v, i) 
case uint, uint8, uint16, uint32, uint64: 
 fmt.Println("A unsigned integer: %d. The type is %T. 
", v, i) 
default: 
 fmt.Println("Unknown!") 
}

我们这里把switch表达式的结果赋给了一个变量。如此以来,我们就可以在该switch语句中使用这个结果了。这段代码被执行后,输出:"A signed integer:11. The type is int. "

最后说一下fallthrough。它既是一个关键字,又可以代表一条语句。fallthrough语句可被包含在表达式switch语句中的case语句中。它的作用是使控制权流转到下一个case。不过要注意fallthrough语句仅能作为case语句中的最后一条语句出现。并且,包含它的case语句不是其所属switch语句的最后一条case语句。

二、select语句

golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。

示例:


ch1 := make (chan int, 1) 
ch2 := make (chan int, 1) 
 
... 
 
select { 
case <-ch1: 
 fmt.Println("ch1 pop one element") 
case <-ch2: 
 fmt.Println("ch2 pop one element") 
}

注意到 select 的代码形式和 switch 非常相似, 不过 select 的 case 里的操作语句只能是【IO 操作】 。

此示例里面 select 会一直等待等到某个 case 语句完成, 也就是等到成功从 ch1 或者 ch2 中读到数据。 则 select 语句结束。

break语句也可以被包含在select语句中的case语句中。它的作用是立即结束当前的select语句的执行。不论其所属的case语句中是否还有未被执行的语句。

【使用 select 实现 timeout 机制】

如下:


timeout := make(chan bool, 1) 
go func() { 
 time.Sleep(time.Second * 10) 
 timeout <- true 
}() 
select { 
case <-pssScanResponseChan: 
 
case <-timeout: 
 fmt.PrintIn("timeout!") 
}

当超时时间到的时候,case2 会操作成功。 所以 select 语句则会退出。 而不是一直阻塞在 ch 的读取操作上。 从而实现了对 ch 读取操作的超时设置。

下面这个更有意思一点。

当 select 语句带有 default 的时候:


ch1 := make (chan int, 1) 
ch2 := make (chan int, 1) 
 
select { 
case <-ch1: 
 fmt.Println("ch1 pop one element") 
case <-ch2: 
 fmt.Println("ch2 pop one element") 
default: 
 fmt.Println("default") 
}

此时因为 ch1 和 ch2 都为空,所以 case1 和 case2 都不会读取成功。 则 select 执行 default 语句。

就是因为这个 default 特性, 我们可以使用 select 语句来检测 chan 是否已经满了。

如下:


ch := make (chan int, 1) 
ch <- 1 
select { 
case ch <- 2: 
default: 
 fmt.Println("channel is full !") 
}

因为 ch 插入 1 的时候已经满了, 当 ch 要插入 2 的时候,发现 ch 已经满了(case1 阻塞住), 则 select 执行 default 语句。 这样就可以实现对 channel 是否已满的检测, 而不是一直等待。

比如我们有一个服务, 当请求进来的时候我们会生成一个 job 扔进 channel, 由其他协程从 channel 中获取 job 去执行。 但是我们希望当 channel 瞒了的时候, 将该 job 抛弃并回复 【服务繁忙,请稍微再试。】 就可以用 select 实现该需求。

此外,利用default特性,我们可以使用select语句将chan清空,如下:


flag := false 
for { 
 select { 
 case <-pssScanResponseChan: 
 continue 
 default: 
 flag = true 
 } 
 if true == flag { 
 break 
 } 
}

热心网友 时间:2022-05-10 19:03

过多地重载switch关键字的语法并不是一件好事,会引起混淆:
举个例子:

bc := make(chan bool)

switch {
case <-bc:
xxxxx
xxxxxxxx
}

如果这里的switch兼有select的作用,你怎么判断case逻辑是“等到从bc里面取一个值”,还是“从bc里面取的值为真”?

select和经典的多路io编程接口select同名,做的事情也相似,易于理解和记忆。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 交谊舞快三每一步就要穿裆吗? 一加7pro为什么开不了Fnatic模式 计算圆柱和圆锥的侧面积、表面积和体积 圆柱与圆锥(计算公式)50分 一个圆柱和一个圆锥等底等高,它们的体积之和是48立方分米。那么圆锥的体积是 电气设备对地绝缘电阻要求 圆柱和圆锥的体积题 关于圆柱体和圆锥体体积的题 相零、相地电阻值应大于多少 电气设备对地绝缘电阻要求? 电气线路对地绝缘电阻达到多少 买个隐形眼镜可以先一只眼睛带八个小时再另外一只眼睛带八个小时吗 女式围巾哪个牌子比较好?(上海的~) 今年流行什么样的围巾女式 女式围巾什么颜色好看 怎么样做个简单的网页 如何删除中国移动详单里一个指定号码 蛋糕怎么画法 黄山景区住山上一般一晚多少钱? 求北京是个情侣去的地方,刚才查了查百度,全都是什么酒店啊,香山啊,北海公园这些地方,没有新意,有没 一套酒吧音响设备价格大概是多少 皮裙的穿着要点 想跟大家了解下酒吧音响设备全套报价一般是多少 皮裙在外国是什么意思 为什么新开很多酒吧都在原声重现专业音响购买音响?朋友推荐也是到那里购买音响,酒吧音响需要多少钱? 水系统的中央空调多久需要保养一次,哪些是重点保养项目? 白色露肩衬衫上衣性格迷人,搭配黑色超短小皮裙,惹人喜爱,你觉得怎么样? livehouse酒吧音响多少钱 岛津数据库版软件是正版原装的吗 中央空调水系统要多久保养一次,保养哪些项目? 中央空调水机组保养价格,还有方案 酒吧音响设备大概需要多少钱 正版数据库与破解区别,破解能正常稳定使用,可以商用吗 正版数据库与破解的有什么区别,能正常,稳定吗 酒吧用的音响一套的报价大概是多少呢? 企业中,用oracle数据库的,用的是正版的还是破解版的 请问各位大神一个600平方左右的酒吧,舞台灯光音响设备大约需要多少钱啊?各位帮忙推荐推荐舞台灯光音响 太原哪里可以买到正版的数据库软件 酒吧灯光音响价格多少 请教:破解版数据库的数据能否导入正版的数据库呢