go中的关键字-select
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 }