First I'll note that it's unusual to use condition variables in Go.
Mutexes are often useful. Condition variables rarely are. Code that
uses condition variables can usually be rewritten more comprehensibly
to use channels.
Timeouts in particular should be done using channels. If you need to
wait for some event with a timeout, convert that event into a channel
send, and use a select statement on that channel and
time.After(timeout).
Ian