При обычном расписании после первого тика main зависает на отправке true: он же единственный получатель signalCh. Затем блокируется и отправитель false.
Какой текст выведет консоль при запуске программы №25
При обычном расписании после первого тика main зависает на отправке true: он же единственный получатель signalCh. Затем блокируется и отправитель false.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Укажите, какой вывод появится в консоли после выполнения приведённого Go‑кода.
import (
"fmt"
"time"
)
func main () {
signalCh := make(chan bool)
go func () {
time.Sleep(time.Second * 3)
fmt.Println("get normal signal")
signalCh <- false
}()
ticker := time.NewTicker(time.Second)
for {
select {
case <- ticker.C:
fmt.Println("ger interrupted signal")
signalCh <- true
case value := <-signalCh:
fmt.Printf("finish %t", value)
return
}
}
}
Ответ
При обычном расписании после первого тика main зависает на отправке true: он же единственный получатель signalCh. Затем блокируется и отправитель false.
Около первой секунды печатается ger interrupted signal, после чего выполнение застревает внутри выбранной ветки select. Этот select уже не может выбрать приём из signalCh. Около третьей секунды горутина печатает get normal signal и тоже ждёт отправки. Строки finish при таком ходе нет.
Если main долго не получал процессор, на первом select могут быть готовы обе ветки; выбор приёма false даст finish false. Поэтому абсолютно фиксированный вывод обещать нельзя. Для прерывания завершайте работу непосредственно в ветке таймера либо используйте отдельный канал уведомления, а не отправку самому себе. Ticker необходимо останавливать.