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