Программа ничего не печатает: 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 или локальная копия. Сейчас функция печати не вызывается вообще.