for { select { // A is the highest priority, if available, do that case <-A: continue default: // don't block here } select { // A and B are high priority, if available, do one case <-A: continue case <-B: continue default: // don't block here } select { // Nothing high priority being available, wait for whatever is available next and do that. case <-A: continue case <-B: continue case <-C: continue } }
Note that every case ends with `continue` so as to go back to the top and re-evaluate all the priority decisions.
So, what do you think? Useful pattern? Horrible anti-pattern?