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

Чтение из закрытого канала

Вопрос

Что выведет код?

ch := make(chan int, 1)
ch <- 1
close(ch)
v, ok := <-ch
fmt.Println(v, ok)
v, ok = <-ch
fmt.Println(v, ok)

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

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

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

Коротко

Правильный ответ: 1 true и 0 false. Закрытый канал сначала отдаёт оставшиеся в буфере значения с ok == true.

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

  1. 1 true, затем panic на втором чтении
  2. 1 true и 1 false
  3. deadlock на первом же чтении
  4. 1 true и 0 falseправильный ответ

Разбор

Закрытый канал сначала отдаёт оставшиеся в буфере значения с ok == true. Когда буфер пуст, чтение сразу возвращает нулевое значение и ok == false, без блокировки и без паники. Паникует только отправка в закрытый канал.

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

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