• 一、Select
  • 二、超时控制
  • 三、break关键字结束select

一、Select

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

select{case <-chan1:// 如果成功读取到chan1中得数据,则进行该case处理语句
case chan2 <- value:// 如果成功向chan2中写入数据,则进行该case处理语句
default:// 如果上面都没有成功,则进入default处理语句
}

简单案例:

func main(){ch := make(chan int)go func(){ch <- 10}()time.Sleep(time.Second)select{case <- ch:fmt.Println("come to read channel")default:fmt.Println("come to default")}
}

二、超时控制

如果所有的case都没有成功,且没有default语句存在时,select语句会一直阻塞,知道至少有一个I/O操作进行,但如果没有,就会一直阻塞,这时我们就可以设置一个超时控制。

  • 1、实现方法一,使用协程:
func main(){timeout := make(chan bool)ch := make(chan string)go func(ch chan bool){time.Sleep(time.Second * 2)ch <- true}(timeout)select {case value := <-ch:fmt.Printf("value is %v",value)case <= timeout: fmt.Println("runing timeout...")}fmt.Println("end this demo")
}

输出结果

runing timeout...
end this demo
  • 2、实现方法二,使用time.After()方法实现:
func main(){ch := make(chan string)select {case value := <-ch:fmt.Printf("value is %v",value)case <= time.After(time.Second): fmt.Println("runing timeout...")}fmt.Println("end this demo")
}

输出结果:

runing timeout...
end this demo

三、break关键字结束select

案例

func main(){ch1 := make(chan int,1)ch2 := make(chan int,1)select{case ch1 <- 10:fmt.Println("this is ch1")breakfmt.Println("ch1 write value")case ch2 <-20:fmt.Println("this is ch2")fmt.Println("ch2 write value")}
}

上述代码中,ch1和ch2两个通道都可以写入值,所以系统会随机选择一个case执行,发现先择执行ch1的case时,由于又break关键字的存在,所以只会打印一句:

this is ch1

但执行ch2的case时,所有内容都会被打印:

this is ch2
ch2 write value

Go 关键字 Select相关推荐

  1. SQLserver关键字select into 用法

    基于现存表创建新表新表     select into  语句 语法     select  select_list into  new_table_name from  old_table_name ...

  2. Selenium2Library库中没有系统关键字select window by handle咋办?

  3. mysql分页关键词_数据库分页关键字

    Mysql分页采用limt关键字 select * from t_order limit 5,10; #返回第6-15行数据 select * from  t_order limit  5; #返回前 ...

  4. golang中的select详解

    注意 监听的case中,没有满足条件的就阻塞 多个满足条件的就任选一个执行 select本身不带循环,需要外层的for default通常不用,会产生忙轮询 break只能跳出select中的一个ca ...

  5. MySQL SELECT:数据表查询语句

    MySQL 表单查询是指从一张表的数据中查询所需的数据,主要有查询所有字段.查询指定字段.查询指定记录.查询空值.多条件的查询.对查询结果进行排序等. MySQL SELECT 基本语法 MySQL ...

  6. 1、SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据.查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高.最重要的操作. SELECT 的语法格式如下: SELE ...

  7. Oracle rollup 关键字用法简介.

    1. 什么是Rollup 在PL/sql 中,  Rollup 这个关键字通常用于select 语句的 group by 后面. 在group by 后面使用rollup关键字,  select语句就 ...

  8. SQL select查询原理--查询语句执行原则转

    1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 1)简单的单表查询 SELECT 字段  FROM ...

  9. T-SQL with关键字

    T-SQL with关键字 Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误: SELECTYEAR(OrderDate) AS OrderYear,COUNT(D ...

  10. mysql中select 的题型_MYSQL经典题型详情解析

    学完了mysql后发现有很多地方不是很明白,于是总结了mysql的经典题型,不论是工作还是面试,我相信还是有一定帮助的. 例题一 ​ 在我的数据库中数据如下(排序有些差别,但是不影响结果) ​ 分析: ...

最新文章

  1. WTL中CMemDC与CDC、CDCHandle的联系
  2. 小鸭脖大生意——绝味鸭脖背后的故事
  3. 【已解决】R语言添加行、列,转置操作
  4. 【情人节表白代码】——情人节将至,10余款浪漫爱心特效送给你爱的那个她
  5. rstudio的数据集怎么建立和保存_这个40M的小工具助你在windows下处理数据如虎添翼...
  6. hadoop服务快速部署
  7. oracle数据库无法写入文件,如何在ORACLE的PL/SQL中将数据写入文件
  8. Simpy学习:基本运行与终止(一)
  9. Windows2008管理---第12章 终端服务器
  10. 虚拟化不会增加安全复杂性
  11. node.js入门及安装
  12. 服务器密码过期了咋修改,重置已过期的密码 (Sun Java System Directory Server Enterprise Edition 6.3 管理指南)...
  13. VC2005工程常用设置系统环境变量设置
  14. raid0 trim linux,6系主板泪流满面,终于支持RAID 0模式下的TRIM了
  15. 《 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失》
  16. java int相除向上取整_JAVA入门第一季学习补充 - 何以解忧?
  17. python scipy.optimize 非线性规划 求解局部最优和全局最优
  18. mysql_check_MySQL中check的用法
  19. 不要拿项目做毕业设计
  20. 好看又炫酷的网页特效例子收集

热门文章

  1. react 怎么获取表格_React之表格操作
  2. 全国多年平均相对湿度空间分布数据
  3. 南华大学ACM队2021年7.14训练赛题解
  4. NYOJ题目1057-寻找最大数(三)
  5. 连接定义点作用_【干货】我的期货交易入场点分析
  6. inno setup安装之前关闭mysql_inno setup 安装前判断进程是否存在,以及停止相应进程转...
  7. md5算出来不一样_西安美发培训学校:为什么我看到的色卡上的颜色和染出来的颜色会不一样呢?...
  8. 电脑配置知识_高品质全铝迷你电脑主机推荐 适合家用/办公/游戏的锐龙APU电脑配置...
  9. 用 IIS 进行ASP.NET 成员/角色管理(1):安全和配置概述
  10. 对当今流行的比赛评分系统的简单分类以及《评委计分系统-双屏版》的类别