Отправитель не может завершить передачу в небуферизированный канал до начала чтения. Main закрывает канал раньше этого, поэтому работник при выполнении отправки получит panic: send on closed channel.
Пример использования канала и горутины в Go
Отправитель не может завершить передачу в небуферизированный канал до начала чтения. Main закрывает канал раньше этого, поэтому работник при выполнении отправки получит panic: send on closed channel.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой вывод будет у следующей программы на Go?
package main
import (
"fmt"
"time"
)
func main() {
dataCh := make(chan int)
go func() {
dataCh <- 1
}()
time.Sleep(time.Millisecond * 500)
close(dataCh)
for val := range dataCh {
fmt.Println(val)
}
time.Sleep(time.Millisecond * 100)
}
Ответ
Отправитель не может завершить передачу в небуферизированный канал до начала чтения. Main закрывает канал раньше этого, поэтому работник при выполнении отправки получит panic: send on closed channel.
Range по уже закрытому пустому dataCh не выведет единицу. Sleep не является синхронизацией; если горутина успеет выполниться до выхода main, её panic завершит процесс. Правильное владение: отправитель выполняет dataCh <- 1, затем close(dataCh), а main сразу читает range без Sleep. Получатель не закрывает канал, пока отправка может продолжаться.