golang的select典型用法
2017-03-01 16:36
531 查看
golang 的 select 的功能和
select, poll, epoll相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。
示例:
ch1 := make (chan int, 1) ch2 := make (chan int, 1) ... select { case <-ch1: fmt.Println("ch1 pop one element") case <-ch2: fmt.Println("ch2 pop one element") }
注意到 select 的代码形式和 switch 非常相似, 不过 select 的 case 里的操作语句只能是【IO 操作】 。
此示例里面 select 会一直等待等到某个 case 语句完成, 也就是等到成功从 ch1 或者 ch2 中读到数据。 则 select 语句结束。
【使用 select 实现 timeout 机制】
如下:
timeout := make (chan bool, 1) go func() { time.Sleep(1e9) // sleep one second timeout <- true }() ch := make (chan int) select { case <- ch: case <- timeout: fmt.Println("timeout!") }
当超时时间到的时候,case2 会操作成功。 所以 select 语句则会退出。 而不是一直阻塞在 ch 的读取操作上。 从而实现了对 ch 读取操作的超时设置。
下面这个更有意思一点。
当 select 语句带有 default 的时候:
ch1 := make (chan int, 1) ch2 := make (chan int, 1) select { case <-ch1: fmt.Println("ch1 pop one element") case <-ch2: fmt.Println("ch2 pop one element") default: fmt.Println("default") }
此时因为 ch1 和 ch2 都为空,所以 case1 和 case2 都不会读取成功。 则 select 执行 default 语句。
就是因为这个 default 特性, 我们可以使用 select 语句来检测 chan 是否已经满了。
如下:
ch := make (chan int, 1) ch <- 1 select { case ch <- 2: default: fmt.Println("channel is full !") }
因为 ch 插入 1 的时候已经满了, 当 ch 要插入 2 的时候,发现 ch 已经满了(case1 阻塞住), 则 select 执行 default 语句。 这样就可以实现对 channel 是否已满的检测, 而不是一直等待。
比如我们有一个服务, 当请求进来的时候我们会生成一个 job 扔进 channel, 由其他协程从 channel 中获取 job 去执行。 但是我们希望当 channel 瞒了的时候, 将该 job 抛弃并回复 【服务繁忙,请稍微再试。】 就可以用 select 实现该需求。
关于垃圾回收
c++写久了的人, 刚接触 golang 的时候最不能理解的就是为什么作者要支持垃圾回收。 不管是从垃圾回收器的实现上看, 还是对于程序员编程习惯的养成方面, 都避免不了编写出的程序性能损失。 但是写了几天 golang 之后, 又觉得有垃圾回收确实大大减轻程序员的心智负担, 降低编程门槛,提高编程效率。 让我联想到 汇编 和 C语言 的关系, 即使 C语言的性能不如汇编写出来的高, 但是后者还是颠覆了前者。
参考
go语言编程go语言程序设计
转载请注明出处: golang的select典型用法
相关文章推荐
- Golang select的使用及典型用法
- golang的select典型用法
- Golang中switch语句和select语句的用法教程
- Golang的switch和select用法
- Golang channel select用法
- 【golang】Go语言学习-select用法
- golang学习之select用法
- 【GOLANG】Go语言学习-select用法
- SQL 基础:Select语句,各种join,union用法
- SQL语句的写法:Update、Case、 Select 一起的用法
- 10个mysql中select语句的简单用法
- select用法详解
- CASE WHEN 及 SELECT CASE WHEN的用法、SUM函数中的数字参数(转)
- Linux C语言中select用法
- TCP socket select用法分析
- select用法详解 http://blog.chinaunix.net/uid-23373524-id-2426940.html
- select into 和 insert into select 区别及用法
- golang 中strconv包用法
- MySQL 中数据的检索(一:select 语句的基本用法)
- select into from 和 insert into select 的用法和区别