Пример использования канала и горутины в Go

Отправитель не может завершить передачу в небуферизированный канал до начала чтения. Main закрывает канал раньше этого, поэтому работник при выполнении отправки получит panic: send on closed channel.

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

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

Отправитель не может завершить передачу в небуферизированный канал до начала чтения. 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. Получатель не закрывает канал, пока отправка может продолжаться.

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

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

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

Подробнее