Q:

How can I explicitly empty a channel?

The short version:
Is there a way to empty a go channel without recreating it, or looping through it? 
The why:
I'm using two channels to send and receive data, and I have an extra channel to signal that a reconnect is needed.
Now when the transport has been reset/reconnected I want to 'empty' the extra channel to make sure that there is not any lingering other reset requests which would cause the thing to reconnect again.

A:

It is not possible to empty a channel without a loop. If you don't have any concurrent receivers, then you can use this simple loop:
for len(ch) > 0 {
  <-ch
}

If you do have concurrent receivers, then use the loop:
L:
for {
    select {
    case <-c:
    default:
       break L
    }
}

A:

What you're describing is inherently racy, since there may be legitimate requests to reconnect on the channel. Rather than trying to drain the channel, I would recommend keeping track of timing.
On your reconnect channel, post the time. When finished with the reconnect, note the time. While consuming the reconnect channel, throw away any messages that are older than your last reconnect.
Another more lockstep solution to achieve this is to make the reconnect channel a bool. Post "true" to reconnect. When the reconnect completes, post "false". Then consume the channel until you find "false."

