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. 替换 MyEclipse 中已有的项目

    一.删除 tomcat 中的项目 1.停止 tomcat 2.删除 tomcat 中的项目 选中项目,然后右键 - Remove deployment,这个可能需要一点时间 二.删除 MyEclips ...

  2. C#常规TcpListener

    1.Xaml <Window x:Class="Server.MainWindow" xmlns="http://schemas.microsoft.com/win ...

  3. C++-蓝桥杯-矩阵乘法[快速幂]

    忘了改矩阵的大小居然还有33分,我醉了 #include <cstdio> ; struct Matrix{int a[N][N];}; int n,m; Matrix A,O,I; Ma ...

  4. spring整合websocket,如何在服务端依赖注入service

    1.在pom.xml文件中添加jar包: <properties> <spring.version>4.0.5.RELEASE</spring.version> & ...

  5. Common Subsequence POJ - 1458 最长公共子序列 线性DP

    #include <iostream> #include <algorithm> #include <string> #include <cstring> ...

  6. UI自动化测试的Page Object模式

    在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...

  7. 4.Docker 操作容器

    启动容器 所需要的命令主要为 docker run.例如,下面的命令输出一个 “Hello World”,之后终止容器. docker run ubuntu:16.04 /bin/echo 'Hell ...

  8. ReviewBoard使用:添加SVN

    1.登录ReviewBoard,选择“Admin” 2.选择 “Repositores”,点击按钮“Add” 3.填写内容,然后点击按钮“SAVE”保存 Name:仓库名称(自己随意写) Hostin ...

  9. javaScript入门(函数)

    目录 JavaScript函数 函数是什么 函数返回值 return特点: 递归函数 匿名函数(anoymous) 自执行函数(通过匿名函数实现) 回调函数 闭包函数 构造函数 构造函数两大类 注意事 ...

  10. 《深入理解Java虚拟机》读书笔记六

    第七章 虚拟机类加载机制 1.类加载的时机 虚拟机的类加载机制: 虚拟机把描述类的数据从class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这 ...