Что выведет код Junior Каналы и select спрашивают часто обновлено

Что выведет Go: range по закрытому буферизованному каналу

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23.

package main

import "fmt"

func main() {
    ch := make(chan int, 3)
    ch <- 1
    ch <- 2
    close(ch)
    for v := range ch {
        fmt.Print(v, " ")
    }
    v, ok := <-ch
    fmt.Println(v, ok, len(ch), cap(ch))
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 1 2 0 false 0 3. Закрытие не выбрасывает данные из буфера: range дочитывает 1 и 2 и завершается.

Что выведет

1 2 0 false 0 3

Разбор

Закрытие не выбрасывает данные из буфера: range дочитывает 1 и 2 и завершается. Дальнейшее чтение сразу даёт нулевое значение и ok == false. Буфер пуст (len 0), ёмкость остаётся 3.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.