golang中的select关键字用法总结
1.官方解释
一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的case涉及到channel有关的I/O操作。即select就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的动作。
2.要点
如果有一个或多个IO操作可以完成,则Go运行时系统会随机的选择一个执行,否则的话,如果有default分支,则执行default分支语句,如果连default都没有,则select语句会一直阻塞,直到至少有一个IO操作可以进行
所有channel表达式都会被求值、所有被发送的表达式都会被求值。求值顺序:自上而下、从左到右.
3.用法
1.使用select实现timeout机制
timeout:=make(chanbool,1) gofunc(){ time.Sleep(1e9)//sleeponesecond timeout<-true }() select{ case<-timeout: fmt.Println("timeout!") }
2.使用select语句来检测chan是否已经满了
ch2:=make(chanint,1) ch2<-1 select{ casech2<-2: default: fmt.Println("channelisfull!") }
3.for-select
packagemain import( "fmt" "time" ) funcmain(){ varerrChan=make(chanint) //定时2s ticker:=time.NewTicker(2*time.Second) deferticker.Stop() gofunc(achanint){ //5s发一个信号 time.Sleep(time.Second*5) errChan<-1 }(errChan) LOOP: for{ select{ case<-ticker.C:{ fmt.Println("Taskstillrunning") } caseres,ok:=<-errChan: ifok{ fmt.Println("channumber:",res) breakLOOP } } } fmt.Println("end!!!") } //输出结果: //Taskstillrunning //Taskstillrunning //channumber:1 //end!!!
附录:
select是golang中的一个控制结构,类似于switch.每一个case都必须为一个通信操作,要么是发送要么是接受。
select随机选择一个可运行的case,如果没有case可以运行,便会阻塞,直到有case可以运行。一个默认的字句总是可以运行的。
select{ casecommunicationclause: statement(s) casecommunicationclause: statement(s) default: statement(s) }
以下描述select语句的语法
- 每个case都必须是一个通信
- 所有channel表达式都会被求值
- 所有被发送的表达式都会被求值
- 如果任意某个通信可以执行,它就会执行;其他就会被忽略
- 如果有多个case都可以运行,select会随机公平的选出一个执行。其他不会执行。
否则
- 如果有default子句,则执行该语句
- 如果没有default子句,select将阻塞,直到某个通信可以执行;channel或者值不会被重复求值
示例
packagemain import"fmt" funcfibonacci(c,quitchanint){ x,y:=0,1 for{ select{ casec<-x: x,y=y,x+y case<-quit: fmt.Println("quit") return } } } funcmain(){ c:=make(chanint) quit:=make(chanint) //startagoroutinetoprintcurrentresult //nobufferincandquitchannel,sothiscode //wouldblockwhenthisgoroutinetrytoprint gofunc(){ fori:=0;i<10;i++{ fmt.Println(<-c) } quit<-0 }() fibonacci(c,quit) }
总结
到此这篇关于golang中的select关键字用法总结的文章就介绍到这了,更多相关golangselect关键字用法内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!