Печатаются пять строк Result from goroutine 0–4 в произвольном порядке, затем main блокируется. Wait и close ниже бесконечного цикла недостижимы.
Буферный канал, горутины и бесконечный select‑цикл
Печатаются пять строк 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 корректно выйдет. Закрывать канал раньше окончания отправок нельзя.