Данный код на Go создает буферизированный канал c с размером буфера 1 и выполняет цикл из 3 итераций, в каждой из которых выполняется select с тремя случаями:
Go: select с буферизированным каналом и default
Данный код на Go создает буферизированный канал c с размером буфера 1 и выполняет цикл из 3 итераций, в каждой из которых выполняется select с тремя случаями:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
package main
func main() { c := make(chan int, 1)
for range 3 {
select {
default:
println(1)
case <-c:
println(2)
case c <- 1:
println(3)
}
}
}
Ответ
Данный код на Go создает буферизированный канал c с размером буфера 1 и выполняет цикл из 3 итераций, в каждой из которых выполняется select с тремя случаями:
default: печатает 1- получение из канала
c: печатает 2 - отправка значения 1 в канал
c: печатает 3
Разберем поведение по итерациям:
- Канал пуст, буфер пуст, можно отправить в канал — срабатывает
case c <- 1, выводит 3. - Теперь в канале есть одно значение (буфер заполнен), отправить нельзя, но можно получить — срабатывает
case <-c, выводит 2. - Канал снова пуст, можно отправить — выводит 3.
Итоговый вывод:
3
2
3
Таким образом, программа демонстрирует работу с буферизированным каналом и выбором между отправкой, получением и дефолтным случаем в select.