Будут напечатаны 0, 2, 4, 6 и 8. Для единственной горутины канал вместимости 1 попеременно пуст и заполнен.
Какой результат выведет программа №8
Будут напечатаны 0, 2, 4, 6 и 8. Для единственной горутины канал вместимости 1 попеременно пуст и заполнен.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст появится в консоли после выполнения следующей Go‑программы:
func main() {
dataCh := make(chan int, 1)
for idx := 0; idx < 10; idx++ {
select {
case val := <-dataCh:
println(val)
case dataCh <- idx:
}
}
}
Ответ
Будут напечатаны 0, 2, 4, 6 и 8. Для единственной горутины канал вместимости 1 попеременно пуст и заполнен.
На чётной итерации канал пуст: чтение не готово, зато можно отправить idx. На следующей итерации он полон: отправка не готова, чтение забирает предыдущее значение и печатает его.
Здесь нет случайного выбора двух готовых веток, потому что других участников и свободных мест при заполненном буфере нет. После десятой итерации последнее значение 8 прочитано, и main завершается. При другой вместимости или дополнительных горутинах рассуждение и результат изменились бы.