Определение вывода из горутин при захвате переменной цикла

Программа ничего не печатает: ReceiveFromCh нигде не вызывается, а main не ждёт отправителей. fmt.Sprintf создаёт строку, но не выводит её.

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

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

Программа ничего не печатает: ReceiveFromCh нигде не вызывается, а main не ждёт отправителей. fmt.Sprintf создаёт строку, но не выводит её.

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

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

Условие

Определите, какие строки будут напечатаны, учитывая, как замыкается переменная цикла внутри горутины.

package main

import (
    "fmt"
)

func main() {
    out := make(chan string, 3)

    for i := 0; i < 5; i++ {
        go func() {
            out <- fmt.Sprintf("Goroutine %d", i)
        }()
    }
}

func ReceiveFromCh(ch chan string) {
    // log job
    fmt.Println(<-ch)
}

Ответ

Программа ничего не печатает: ReceiveFromCh нигде не вызывается, а main не ждёт отправителей. fmt.Sprintf создаёт строку, но не выводит её.

Буфер канала вмещает 3 значения, поэтому без получателя не более трёх отправок смогут завершиться. Остальные могут заблокироваться до завершения процесса, но main просто возвращается, не ожидая их.

Особенности захвата i не меняют отсутствие вывода. Если добавить чтение пяти результатов, при новой семантике циклов значения будут соответствовать 0–4 в произвольном порядке; при старой нужен явный аргумент i или локальная копия. Сейчас функция печати не вызывается вообще.

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

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

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

Подробнее