Объединение канала данных с каналом отмены: читаем из того, что готово первым. Либо один канал "or" из нескольких: первый пришедший элемент. Реализация: горутина с select по нескольким каналам пишет в один выходной; при закрытии любого - закрыть выход.
select {
case v := <-ch: return v
case <-done: return zero, errDone
}