Как избежать проблемы переключения Ticker раньше, чем придет сообщение из канала

«Как избежать проблемы переключения Ticker раньше, чем придет сообщение из канала» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использовать select с default для неблокирующего чтения из канала:

ticker := time.NewTicker(interval)
defer ticker.Stop()

for {
    select {
    case msg := <-msgChan:
        // обработка сообщения
    case <-ticker.C:
        // обработка тика
    default:
        // не блокируемся, если нет сообщений
        time.Sleep(shortDelay) // небольшая задержка
    }
}

Альтернативно - буферизировать канал или использовать два отдельных канала для сообщений и тиков. Важно не блокировать обработчик тиков, если нет сообщений.