Что выведет код Middle Каналы и select обновлено
Что выведет Go: select с одним готовым каналом и nil-каналом
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.
package main
import (
"fmt"
"time"
)
func main() {
var never chan int
ready := make(chan string, 1)
ready <- "ok"
for i := 0; i < 2; i++ {
select {
case v := <-never:
fmt.Println("never", v)
case s := <-ready:
fmt.Println(s)
case <-time.After(50 * time.Millisecond):
fmt.Println("timeout")
}
}
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: ok, timeout. Чтение из nil-канала никогда не готово, ветка фактически выключена.
Что выведет
ok
timeout
Разбор
Чтение из nil-канала никогда не готово, ветка фактически выключена. На первой итерации готов только ready. На второй он пуст, и через 50 мс срабатывает таймер. Случайного выбора нет, потому что готова ровно одна ветка.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.