Golang select 语句
2021-11-21 本文已影响0人
BitInterfc
select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。
select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。
Select 的语法如下:
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
}
Select 和Channel 协同使用:
它用于等待一个或者多个channel的输出。
应用场景: 主goroutine等待子goroutine完成,但是子goroutine无限运行,导致主goroutine会一直等待下去。而主线程想假如超过了一定的时没有返回的话,进行超时判断然后继续运行下去。
package main
import (
"time"
"fmt"
)
var chs chan int = make(chan int,1)
func write(){
time.Sleep(3 * time.Second)
chs<-1
}
func read(){
select {
case ch1:=<-chs:
fmt.Println(ch1)
return
case <-time.After(2 * time.Second):
fmt.Println("read time out")
return
}
}
func main() {
go write()
read()
}
在文本的用例中,write() 在三秒后才会向通道发送信号,而read() tiamout只有两秒,程序的运行结果就是打印time out:
image.png