1. select的使用

  定义:在golang里头select的功能与epoll(nginx)/poll/select的功能类似,都是坚挺IO操作,当IO操作发生的时候,触发相应的动作。

1.1 一些使用规范

  在Go的语言规范中,select中的case的执行顺序是随机的,当有多个case都可以运行,select会随机公平地选出一个执行,其他的便不会执行:

复制代码
 1 package main  2  3 import "fmt" 4  5 func main() {  6     ch := make (chan int, 1)  7  8     ch<-1 9     select { 10     case <-ch: 11         fmt.Println("随机一") 12     case <-ch: 13         fmt.Println("随机二n") 14     } 15 }
复制代码

  输出内容为随机一二里面的任意一个。

  case后面必须是channel操作,否则报错;default子句总是可运行的,所以没有default的select才会阻塞等待事件 ;没有运行的case,那么将会阻塞事件发生报错(死锁)。

1.2 select的应用场景

timeout 机制(超时判断)
复制代码
 1 package main  2  3 import (  4     "fmt" 5     "time" 6 )  7  8 func main() {  9     timeout := make (chan bool, 1) 10     go func() { 11         time.Sleep(1*time.Second) // 休眠1s,如果超过1s还没I操作则认为超时,通知select已经超时啦~12         timeout <- true13     }() 14     ch := make (chan int) 15     select { 16     case <- ch: 17     case <- timeout: 18         fmt.Println("超时啦!") 19     } 20 }