博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go关键字之select
阅读量:6278 次
发布时间:2019-06-22

本文共 1236 字,大约阅读时间需要 4 分钟。

select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。select中的case语句必须是一个channel操作select中的default子句总是可运行的。如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。如果没有可运行的case语句,且有default语句,那么就会执行default的动作。如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行典型用法1.超时判断//比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行var resChan = make(chan int)// do requestfunc test() {    select {    case data := <-resChan:        doData(data)    case <-time.After(time.Second * 3):        fmt.Println("request time out")    }}func doData(data int) {    //...}2.退出//主线程(协程)中如下:var shouldQuit=make(chan struct{})fun main(){    {        //loop    }    //...out of the loop    select {        case <-c.shouldQuit:            cleanUp()            return        default:        }    //...}//再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行close(shouldQuit)3.判断channel是否阻塞//在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断ch := make (chan int, 5)//...data:=0select {case ch <- data:default:    //做相应操作,比如丢弃data。视需求而定}--------------------- 参考:https://blog.csdn.net/zhaominpro/article/details/77570290?utm_source=debugrun&utm_medium=referral

 

 

注:select主要进行channel状态的判断,本质是channel能否有数据读出,通过该判断进行一些有趣的应用。

你可能感兴趣的文章
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
多线程基础知识
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>