Буферный канал, горутины и бесконечный select‑цикл

Печатаются пять строк Result from goroutine 0–4 в произвольном порядке, затем main блокируется. Wait и close ниже бесконечного цикла недостижимы.

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

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

Печатаются пять строк Result from goroutine 0–4 в произвольном порядке, затем main блокируется. Wait и close ниже бесконечного цикла недостижимы.

Подробный разбор

Ответ с пояснениями

Условие

Какой будет вывод следующей программы?

func main() {
    var wgGroup sync.WaitGroup
    bufChan := make(chan string, 3)

    for idx := 0; idx < 5; idx++ {
        wgGroup.Add(1)
        go func(ch chan<- string, i int, wg *sync.WaitGroup) {
            defer wg.Done()
            ch <- fmt.Sprintf("Result from goroutine %s", strconv.Itoa(i))
        }(bufChan, idx, &wgGroup)
    }

    for {
        select {
        case v := <-bufChan:
            fmt.Println(v)
        }
    }

    wgGroup.Wait()
    close(bufChan)
}

Ответ

Печатаются пять строк Result from goroutine 0–4 в произвольном порядке, затем main блокируется. Wait и close ниже бесконечного цикла недостижимы.

Буфер размером 3 не мешает завершить все отправки, поскольку main параллельно читает. Но после пятого результата новых значений нет, а канал так и не закрывается.

Запустите отдельную горутину go func() { wgGroup.Wait(); close(bufChan) }() до чтения и замените бесконечный select на for v := range bufChan. Тогда завершение работников закроет поток и main корректно выйдет. Закрывать канал раньше окончания отправок нельзя.

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

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

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

Подробнее