Go: select с буферизированным каналом и default

Данный код на Go создает буферизированный канал c с размером буфера 1 и выполняет цикл из 3 итераций, в каждой из которых выполняется select с тремя случаями:

Короткий ответ

Что ответить на собеседовании

Данный код на 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

Разберем поведение по итерациям:

  1. Канал пуст, буфер пуст, можно отправить в канал — срабатывает case c <- 1, выводит 3.
  2. Теперь в канале есть одно значение (буфер заполнен), отправить нельзя, но можно получить — срабатывает case <-c, выводит 2.
  3. Канал снова пуст, можно отправить — выводит 3.

Итоговый вывод:

3
2
3

Таким образом, программа демонстрирует работу с буферизированным каналом и выбором между отправкой, получением и дефолтным случаем в select.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее