博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【基本流程控制】4.select语句
阅读量:6214 次
发布时间:2019-06-21

本文共 1253 字,大约阅读时间需要 4 分钟。

hot3.png

Go语言-select语句

    select语句属于条件分支流程控制方法,不过它只能用于通道。它可以包含若干条case语句,并根据条件选择其中的一个执行。进一步说,select语句中的case关键字只能后跟用于通道的发送操作的表达式以及接收操作的表达式或语句。示例如下:

ch1 := make(chan int, 1)ch2 := make(chan int, 1)// 省略若干条语句select {case e1 := <-ch1:    fmt.Printf("1th case is selected. e1=%v.\n", e1)case e2 := <-ch2:    fmt.Printf("2th case is selected. e2=%v.\n", e2)default:    fmt.Println("No data!")}

    如果该select语句被执行时通道ch1ch2中都没有任何数据,那么肯定只有default case会被执行。但是,只要有一个通道在当时有数据就不会轮到default case执行了。显然,对于包含通道接收操作的case来讲,其执行条件就是通道中存在数据(或者说通道未空)。如果在当时有数据的通道多于一个,那么Go语言会通过一种伪随机的算法来决定哪一个case将被执行。

   
   另一方面,对于包含通道发送操作的case来讲,其执行条件就是通道中至少还能缓冲一个数据(或者说通道未满)。类似的,当有多个case中的通道未满时,它们会被随机选择。请看下面的示例:

ch3 := make(chan int, 100)// 省略若干条语句select {case ch3 <- 1:    fmt.Printf("Sent %d\n", 1)case ch3 <- 2:    fmt.Printf("Sent %d\n", 2)default:    fmt.Println("Full channel!")}

    该条select语句的两个case中包含的都是针对通道ch3的发送操作。如果我们把这条语句置于一个循环中,那么就相当于用有限范围的随机整数集合去填满一个通道。

   
    请注意,如果一条select语句中不存在default case, 并且在被执行时其中的所有case都不满足执行条件,那么它的执行将会被阻塞!当前流程的进行也会因此而停滞。直到其中一个case满足了执行条件,执行才会继续。我们一直在说case执行条件的满足与否取决于其操作的通道在当时的状态。这里特别强调一点,即:未被初始化的通道会使操作它的case永远满足不了执行条件。对于针对它的发送操作和接收操作来说都是如此。
  
    最后提一句,break语句也可以被包含在select语句中的case语句中。它的作用是立即结束当前的select语句的执行,不论其所属的case语句中是否还有未被执行的语句。

转载于:https://my.oschina.net/u/3683692/blog/3036502

你可能感兴趣的文章
未能加载文件或程序集 ICSharpCode.SharpZipLib
查看>>
shellKali Linux Web 渗透测试— 初级教程(第三课)
查看>>
Examples of GoF Design Patterns(GOF提及的设计模式在java中的例子)
查看>>
【译】SQL Server误区30日谈-Day11-镜像在检测到故障后瞬间就能故障转移
查看>>
Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库
查看>>
PostgreSQL在何处处理 sql查询之五十九
查看>>
大叔也说Xamarin~Android篇~原生登陆与WebView的网站如何共享Session
查看>>
.NET中zip的压缩和解压——SharpCompress
查看>>
IdentityServer4 通过 AccessToken 获取 UserClaims
查看>>
Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
查看>>
设计模式之美:Chain of Responsibility(职责链)
查看>>
[CareerCup] 17.1 Swap Number In Place 互换位置
查看>>
WCF走你~一个简单的例子,根据用户ID,从用户模块(用户服务器)获得实体
查看>>
解决SecureCRT中文版“数据库里没找到防火墙‘无’”的错误提示
查看>>
CentOS 7.2下 RabbitMQ 安装记录
查看>>
CSS魔法堂:不得不说的Containing Block
查看>>
使用p3p跨域设置Cookie
查看>>
类变量、实参、形参、方法参数、代码块参数
查看>>
[LeetCode] Bulb Switcher 灯泡开关
查看>>
Windows Mobile 开发系列文章收藏 - GPRS/上网设置
查看>>