Что выведет код 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 ошибок.