Возможны stop signal received или panic: send on closed channel. Закрытый doneCh не гарантирует выбора ветки отмены.
Какой текст появится в консоли при запуске программы?
Возможны stop signal received или panic: send on closed channel. Закрытый doneCh не гарантирует выбора ветки отмены.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод получит консоль после выполнения представленного ниже кода на Go.
package main
import "fmt"
func main() {
messageCh := make(chan string, 1)
close(messageCh)
doneCh := make(chan struct{})
close(doneCh)
select {
case messageCh <- "msg":
fmt.Println("msg sent")
case <-doneCh:
fmt.Println("stop signal received")
}
}
Ответ
Возможны stop signal received или panic: send on closed channel. Закрытый doneCh не гарантирует выбора ветки отмены.
Select может выбрать отправку в уже закрытый messageCh, и тогда panic произойдёт до fmt.Println("msg sent"). Обе ветки готовы, приоритета у чтения нет. Исправление — корректный жизненный цикл канала: закрывать его только после окончания всех отправителей, а не рассчитывать на проверку другого канала.