select 是 Go 中的一个控制结构。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。

select语句的语法结构和switch语句很相似,也有case语句和default语句:

 select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
}

说明:

  • 每个case都必须是一个通信

  • 所有channel表达式都会被求值

  • 所有被发送的表达式都会被求值

  • 如果有多个case都可以运行,select会随机公平地选出一个执行。其他不会执行。

  • 否则:

    如果有default子句,则执行该语句。

    如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。

package main

import (
"fmt"
"time"
) func main() {
/*
分支语句:if,switch,select
select语句类型于switch语句
但是select语句会随机执行一个可运行的case
如果没有case可以运行,要看是否有default,如果有就执行default,否则就进入阻塞,直到有case可以运行
*/
ch1 := make(chan int)
ch2 := make(chan int) go func() {
time.Sleep(3 * time.Second)
ch1 <- 100
}() go func() {
time.Sleep(3 * time.Second)
ch2 <- 200
}() select {
case num1 := <-ch1:
fmt.Println("ch1中获取的数据。。", num1)
case num2, ok := <-ch2:
if ok {
fmt.Println("ch2中读取的数据。。", num2)
} else {
fmt.Println("ch2通道已经关闭。。")
} default:
fmt.Println("default语句。。。")
} fmt.Println("main..over...")
}

 

Go_select的更多相关文章

随机推荐

  1. yii2 生成随机字符串

    uuid uuid use Faker\Provider\Uuid; Uuid::uuid(); yii自带 生成32位字符串 Yii::$app->getSecurity()->gene ...

  2. 自定义结构体 Map

    struct Hashmap{ ,maxe=; ],nxt[maxe+],w[maxe+]; ]; ;;} void Add(int x,int y){son[++E]=y;nxt[E]=lnk[x] ...

  3. javaWeb快速入门+——初体验-HelloWorld

    文章转载自 https://www.cnblogs.com/1906859953Lucas/p/10821840.html 练习成品下载 https://www.lanzous.com/i9fljkj ...

  4. Accept Xcode/iOS License to run git

    在没有安装Xcode的情况下, 使用了 webstorm 的git,提示 安装xcode,安装完成后,并没有打开xcode,而是再次使用git,发现 提示 输入以下命令行: sudo xcodebui ...

  5. angular2 给下拉框动态赋值

    html页中 其中aab是从后台获取的动态数据

  6. C++——继承与派生

    1.类的继承与派生  保持已有类的特性而构造新类的过程成为继承: 在已有类的基础上新增自己的特性而产生新类的过程称为派生: 被继承的已有类为基类:派生出的新类成为派生类.继承和派生其实是一回事. 继承 ...

  7. 关于XXE

    NJUPT CTF2019: 做题的时候,抓包看了一下,响应XML格式消息,并没有严格过滤,这道题读文件, <!DOCTYPE foo [ <!ENTITY xxe SYSTEM &quo ...

  8. IIS 部署asp.net Core程序注意事项

    Install the .NET Core Windows Server Hosting bundle Install the.NET Core Runtime 修改应用程序池的.net framew ...

  9. javascript闭包的理解和实例

    所谓闭包,值得是词法表示包括不必要计算的变量的函数,也就是说,该函数可以使用函数外定义的变量. 顺便提示一下: 词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通 ...

  10. jdk8-》joining、groupingBy、summarizingInt函数

    拼接函数 Collectors.joining // 3种重载方法 Collectors.joining() Collectors.joining("拼接符") Collector ...