全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Golang中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. \n", v, i) 
case uint, uint8, uint16, uint32, uint64: 
 fmt.Println("A unsigned integer: %d. The type is %T. \n", 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 
 } 
} 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# golang  # switch语句  # switch  # select用法  # Golang switch语句的具体使用  # go中switch语句的用法详解  # golang中一种不常见的switch语句写法示例详解  # Go语言学习之Switch语句的使用  # golang switch语句的灵活写法介绍  # Go语言每天必学之switch语句  # 深入剖析Go语言编程中switch语句的使用  # 探索Go语言中的switch高级用法  # 满了  # 可以使用  # 又可  # 就可以  # 而不是  # 是一个  # 就会  # 相关内容  # 还可以  # 最好的  # 多个  # 出现在  # 可以用  # 这段  # 要注意  # 给了  # 注意到  # 英文  # 给大家  # 这篇文章 


相关文章: 网站制作大概多少钱一个,做一个平台网站大概多少钱?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  如何自定义建站之星网站的导航菜单样式?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何快速选择适合个人网站的云服务器配置?  如何选择域名并搭建高效网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何在宝塔面板中修改默认建站目录?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何快速登录WAP自助建站平台?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  C#如何使用XPathNavigator高效查询XML  建站之星伪静态规则如何设置?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  广州美橙建站如何快速搭建多端合一网站?  公司网站的制作公司,企业网站制作基本流程有哪些?  建站之星如何通过成品分离优化网站效率?  网站代码制作软件有哪些,如何生成自己网站的代码?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  小建面朝正北,A点实际方位是否存在偏差?  建站主机系统SEO优化与智能配置核心关键词操作指南  如何在Golang中使用replace替换模块_指定本地或远程路径  如何快速搭建高效香港服务器网站?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  实现点击下箭头变上箭头来回切换的两种方法【推荐】  建站之星安装提示数据库无法连接如何解决?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  定制建站是什么?如何实现个性化需求?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  建站上传速度慢?如何优化加速网站加载效率?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  制作旅游网站html,怎样注册旅游网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  宁波自助建站系统如何快速打造专业企业网站?  如何在建站之星网店版论坛获取技术支持?  Python如何创建带属性的XML节点  微信小程序 五星评分(包括半颗星评分)实例代码  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  c# await 一个已经完成的Task会发生什么  如何在IIS管理器中快速创建并配置网站?  如何通过万网虚拟主机快速搭建网站?  如何通过VPS建站无需域名直接访问?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何用美橙互联一键搭建多站合一网站?  创业网站制作流程,创业网站可靠吗?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  建站之星会员如何解锁更多建站功能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。