联系我们 - 广告服务
您的当前位置:官网首页 > 资讯 > 时局 >

Go 关键字Select

来源: 编辑: 时间:2019-08-28
导读: select 是go语言中常用的一个关键字,linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操......

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
 go func{
 ch - 10
 time.sleep
 select{
 case - ch:
 fmt.println
 default:
 fmt.println
}

如果所有的case都没有成功,且没有default语句存在时,select语句会一直阻塞,知道至少有一个i/o操作进行,但如果没有,就会一直阻塞,这时我们就可以设置一个超时控制。

实现方法一,使用协程:

func main{
 timeout := make
 ch := make
 go func{
 time.sleep
 ch - true
 }
 select {
 case value := -ch:
 fmt.printf
 case = timeout: 
 fmt.println
 fmt.println
}

输出结果:

runing timeout...
end this demo

实现方法二,使用time.after方法实现:

func main{
 ch := make
 select {
 case value := -ch:
 fmt.printf
 case = time.after: 
 fmt.println
 fmt.println
}

输出结果:

runing timeout...
end this demo

案例:

func main{
 ch1 := make
 ch2 := make
 select{
 case ch1 - 10:
 fmt.println
 break
 fmt.println
 case ch2 -20:
 fmt.println
 fmt.println
}

上述代码中,ch1和ch2两个通道都可以写入值,所以系统会随机选择一个case执行,发现先择执行ch1的case时,由于又break关键字的存在,所以只会打印一句:

this is ch1

但执行ch2的case时,所有内容都会被打印:

this is ch2
ch2 write value
责任编辑:

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

网友评论:

在“\templets\demo\comments.htm”原来的内容全部删除,插入第三方评论代码,如果不需要评论功能,删除comments.html里面的内容即可
推荐使用友言、多说、畅言(需备案后使用)等社会化评论插件

Copyright © 2018 太阳城娱乐场太阳城娱乐场-新太阳城 All Rights Reserved Power by DedeCms
本站所有资讯来源于网络 如有侵权请联系QQ:9490489
Top