Канал done (часто chan struct{}) сигнализирует отмену. Закрытие done - широковещательный сигнал всем: select { case <-done: return }. Либо передают контекст с отменой вместо отдельного канала. Закрывает тот, кто инициирует остановку.
done := make(chan struct{})
go func() { <-sig; close(done) }()
select { case <-done: return; case v := <-ch: ... }