Sobes.tech
Назад к вопросам
Senior
3

package main func main() { c := make(chan int) for range 3 { select { default: println(1) case <-c: println(2) case c <- 1: println(3) } } }

Компании, где спрашивали
Wildberries & Russ Bank

Ответ от нейросети

sobes.tech AI

В данном коде есть несколько ошибок и недочётов:

  1. Цикл for range 3 некорректен, так как range применяется к срезам, массивам, строкам, каналам или мапам, а не к числам. Правильный вариант — использовать for i := 0; i < 3; i++.

  2. Канал c создан без буфера (make(chan int)), поэтому операции отправки и получения блокируются, если нет соответствующего получателя или отправителя.

  3. В конструкции select есть три кейса:

    • default — выполняется, если ни один из других кейсов не готов.
    • case <-c: — попытка получить из канала.
    • case c <- 1: — попытка отправить в канал.

Поскольку канал не буферизирован и никто не читает из него, попытка отправить в канал (c <- 1) заблокируется, и этот кейс не будет выбран.

Поскольку никто не отправляет в канал, кейс case <-c: тоже не готов.

Таким образом, каждый раз будет выполняться default, и программа выведет три раза 1.

Исправленный пример:

package main

func main() {
    c := make(chan int)

    for i := 0; i < 3; i++ {
        select {
        default:
            println(1)
        case <-c:
            println(2)
        case c <- 1:
            println(3)
        }
    }
}

Результат выполнения будет:

1
1
1

Если канал сделать буферизированным, например make(chan int, 1), то кейс отправки может сработать, и вывод изменится.