Go 关键字Select
程序员文章站
2022-12-21 10:26:47
select select 是Go语言中常用的一个关键字,Linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的case涉及到channel有关的I/O操作。 go select{ ca ......
select
select 是go语言中常用的一个关键字,linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的case涉及到channel有关的i/o操作。
select{ case <-chan1: // 如果成功读取到chan1中得数据,则进行该case处理语句 case chan2 <- value: // 如果成功像chan2中写入数据,则进行该case处理语句 default: // 如果上面都没有成功,则进入default处理语句 }
简单案例:
func main(){ ch := make(chan int) go func(){ ch <- 10 }() time.sleep(time.second) select{ case <- ch: fmt.println("come to read channel") default: fmt.println("come to default") } }
超时控制
如果所有的case都没有成功,且没有default语句存在时,select语句会一直阻塞,知道至少有一个i/o操作进行,但如果没有,就会一直阻塞,这时我们就可以设置一个超时控制。
实现方法一,使用协程:
func main(){ timeout := make(chan bool) ch := make(chan string) go func(ch chan bool){ time.sleep(time.second * 2) ch <- true }(timeout) select { case value := <-ch: fmt.printf("value is %v",value) case <= timeout: fmt.println("runing timeout...") } fmt.println("end this demo") }
输出结果:
runing timeout... end this demo
实现方法二,使用time.after()方法实现:
func main(){ ch := make(chan string) select { case value := <-ch: fmt.printf("value is %v",value) case <= time.after(time.second): fmt.println("runing timeout...") } fmt.println("end this demo") }
输出结果:
runing timeout... end this demo
break关键字结束select
案例:
func main(){ ch1 := make(chan int,1) ch2 := make(chan int,1) select{ case ch1 <- 10: fmt.println("this is ch1") break fmt.println("ch1 write value") case ch2 <-20: fmt.println("this is ch2") fmt.println("ch2 write value") } }
上述代码中,ch1和ch2两个通道都可以写入值,所以系统会随机选择一个case执行,发现先择执行ch1的case时,由于又break关键字的存在,所以只会打印一句:
this is ch1
但执行ch2的case时,所有内容都会被打印:
this is ch2 ch2 write value