select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。
select中的case语句必须是一个channel操作 select中的default子句总是可运行的。 如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。
如果没有可运行的case语句,且有default语句,那么就会执行default的动作。
如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行
典型用法
.超时判断 //比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行
var resChan = make(chan int)
// do request
func test() {
select {
case data := <-resChan:
doData(data)
case <-time.After(time.Second * ):
fmt.Println("request time out")
}
} func doData(data int) {
//...
} .退出 //主线程(协程)中如下:
var shouldQuit=make(chan struct{})
fun main(){
{
//loop
}
//...out of the loop
select {
case <-c.shouldQuit:
cleanUp()
return
default:
}
//...
} //再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行
close(shouldQuit) .判断channel是否阻塞 //在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
ch := make (chan int, )
//...
data:=
select {
case ch <- data:
default:
//做相应操作,比如丢弃data。视需求而定
}
---------------------

参考:https://blog.csdn.net/zhaominpro/article/details/77570290?utm_source=debugrun&utm_medium=referral

注:select主要进行channel状态的判断,本质是channel能否有数据读出,通过该判断进行一些有趣的应用。

go关键字之select的更多相关文章

  1. Oracle day01 select where关键字

    select关键字 作用:检索“列” 注意:1.select后面的列可以起别名(查询的显示结果) 1) 列名后面一个空格后添加别名(别名中不许有“空格”) 2) 列名后面一个空格后使用双引号添加别名 ...

  2. Go 关键字Select

    select select 是Go语言中常用的一个关键字,Linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操作可以被立即执行.它类似于 ...

  3. Selenium2Library中select frame关键字对没有name和id的frame或者iframe的处理

    elenium2Library中原有的select_frame函数(对应的关键字为select frame)可根据locator选择frame,但是,若某个frame或者iframe没有id,没有na ...

  4. SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字

    SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...

  5. Oracle的select使用

    1.select : 语法: select [distinct] {*,column [alias],...} from table 注:[]括起来的内容代表可有可无 * 代表所有列 distinct ...

  6. oracle ORA-01747(系统保留关键字)user.table.column, table.column 或列说明无效 hibernate映射oracle保留关键字

    1.查询系统关键 select * from v$reserved_words 确认你使用的是否为关键字: select * from v$reserved_words w where w.KEYWO ...

  7. SQL RIGHT JOIN 关键字

    SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行. RIGHT JOIN ...

  8. SQL LEFT JOIN 关键字

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...

  9. SQL Server DML(SELECT)常见用法(二)

    1   引言 上篇讲到SQL Server中DML的基本使用方法,其中SELECT语句是最常用的语句,其功能强大,结构复杂,下面通过例子,具体介绍其使用方法. 2 SELECT查询语句 SELECT语 ...

随机推荐

  1. Redis、Memcache、MongoDb的优缺点

    Redis.Memcache.MongoDb的优缺点 Redis优点 支持多种数据结构,如 string(字符串). list(双向链表).dict(hash表).set(集合).zset(排序set ...

  2. Java中Reflect的基本使用

    首先在package reflect下定义了一个类Book package reflect; class Book{ private String title; private double pric ...

  3. django之ajax补充

    之前的ajax使用都是依据jquery来使用的,本篇会先分析ajax的原生的js代码实现,还有jsonp的介绍和最终使用. 本篇导航: js实现的ajax 同源策略与Jsonp 一.js实现的ajax ...

  4. ARMv8学习 —— SP_EL0和SP_ELx

    在AArch64状态下,SP对应的物理寄存器有如下四个(某一时刻只能对应下面其中一个): SP_EL0和SP_EL1 SP_EL2 SP_EL3 如何使用呢? 1.如果程序运行在EL0,那么使用的是S ...

  5. java springboot2 jquery 抽奖项目源码

    java+springboot2+jquery+jdk8   实现的多种抽奖效果! 体验抽奖地址: http://47.98.175.6:8091/ 赞助获得源码!!!

  6. ubuntu 安装jdk 的两种方式:

    :通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用ppa/源方式安装 1.添加ppa sudo ...

  7. MyBatis架构与源码分析<资料收集>

    1.架构与源码分析 :https://www.cnblogs.com/luoxn28/p/6417892.html .https://www.cnblogs.com/wangdaijun/p/5296 ...

  8. Android 获取Activity当前view

    View cv = getWindow().getDecorView(); 来自为知笔记(Wiz)

  9. TensorFlow实战Google深度学习框架10-12章学习笔记

    目录 第10章 TensorFlow高层封装 第11章 TensorBoard可视化 第12章 TensorFlow计算加速 第10章 TensorFlow高层封装 目前比较流行的TensorFlow ...

  10. Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)

    网上很多资料都是取消SIP机制,安装完再恢复.可是基于用户的权限来安装模块包显得更加合理. 第一种:(推荐)pip install module --user -U http://www.jiansh ...