概述

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