Выбор ответа Middle Каналы и select спрашивают часто обновлено

Таймаут на операцию через select

Вопрос

Как ограничить ожидание ответа из канала res одной секундой?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: select { case v := <-res: ...; case <-time.After(time.Second): ... }. select ждёт первое из двух событий: ответ или срабатывание таймера.

Варианты ответа

  1. time.Sleep(time.Second); v := <-res, ожидание ограничено сном
  2. select { case v := <-res: ...; case <-time.After(time.Second): ... }правильный ответ
  3. v := <-res; if time.Since(start) > time.Second { ... }
  4. res.SetDeadline(time.Now().Add(time.Second))

Разбор

select ждёт первое из двух событий: ответ или срабатывание таймера. Sleep перед чтением всегда ждёт секунду и потом всё равно может зависнуть. Проверка времени после чтения не ограничивает само ожидание. У каналов нет дедлайнов. В сервисном коде вместо time.After чаще используют ctx.Done() от context.WithTimeout.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.