Ответ
Использовать select с default для неблокирующего чтения из канала:
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case msg := <-msgChan:
// обработка сообщения
case <-ticker.C:
// обработка тика
default:
// не блокируемся, если нет сообщений
time.Sleep(shortDelay) // небольшая задержка
}
}
Альтернативно - буферизировать канал или использовать два отдельных канала для сообщений и тиков. Важно не блокировать обработчик тиков, если нет сообщений.