概述
selectchannelIOIOcaseselectmaingoroutine
select实现原理
Golangselectcasedefaultdefaultcaseselectcasecasecase
执行流程
在默认的情况下,select 语句会在编译阶段经过如下过程的处理:
case Channel selectgo scase scase case for if case
case数据结构
selectcasescasesrc/runtime/select.go:scasecase
defaultcasechannelscaseccasechannelcasechannelcasechannel
读channel写channeldefault
scase.kind
scase.elemchannelscase.elemchannel
执行select
selectgo()selectcasecase if selectgo()
src/runtime/select.go:selectgo()
selectgocase pollOrder lockOrder
函数参数:
selectgo()scasepollorderscasechannellockorderselectgoscasecasecasechannelchannelscase
函数返回值:
casecasechannlecasechannel
循环
Channel selectChannel casesudog
select case
caseChannel
caseChannel
Channel sendqGoroutinerecvGoroutineChannel bufrecv Channel rclose
case Channel
Channelrclose Channel recvqGoroutinesend Channel
case Channel selectgoselect
总结
selectGo select selectblockGoroutineselectcaseif ch == nil {block}; n;
selectgopollOrderChannelOrderpollOrdercaseChannelGoroutine Channel sendq recvq gopark
selectgo