I don't believe the actual use case described can be mapped. From what I understand, the intended behavior was a) put the goroutine to sleep until some communication can proceed b) if exactly one communication can proceed, do it c) if multiple communications can proceed, choose the one with the highest priority
The suggested solutions (or any I can think of) violate at least one of these. They either wait busily, violating a, or they try to communicate in priority-order, then, as a last resort, block on any particular case, violating b, or they fall back to a regular select, violating c. I don't know enough about how select is implemented to pass any judgement on whether this can be efficiently implemented, but I'm also not sure it's such a great idea. Choosing a case uniformly at random was a deliberate design decision to prevent starvation. There is a certain danger in people not realizing that they become susceptible to starvation if they do this. It's also a feature rabbit-hole <https://commandcenter.blogspot.ch/2012/06/less-is-exponentially-more.html>. I'd predict, that next up, someone who experiences starvation wants to add weighted scheduling ("give this case an 80% chance of succeeding and this other case 20%, so that eventually either will proceed") or more complicated scheduling strategies. I think such edge-cases for scheduling requirements should rather be implemented separately in a library. Yes, it's complicated code, but that's all the more reason why it shouldn't be in everyone's go runtime. On Wed, Jan 25, 2017 at 4:23 PM, Egon <egonel...@gmail.com> wrote: > On Wednesday, 25 January 2017 15:14:27 UTC+2, T L wrote: >> >> sometimes, I do want one case on a select block get selected even if >> there are multiple unblocked cases. >> For example, I don't want the dataCh case is selected if the stopCh and >> the timer channel are unblocked: >> >> select { >> case <- stopCh: >> return >> case value := <-dataCh: >> } >> >> select { >> case <- time.After(time.Second): >> return >> case dataCh <- value: >> } >> >> Is there a solution to satisfy my need currently? >> > > type poller func() bool > var pollers []poller > > pollers = append(pollers, func() bool { > select { > case <-priority: > // ... > default: > return false > } > return true > }) > > for { > for _, p := range pollers { > if p() { > break > } > } > } > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.