Что выведет код Middle Каналы и select обновлено

Что выведет Go: синхронизация через небуферизованный канал

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import "fmt"

func main() {
    ch := make(chan int)
    done := make(chan struct{})
    go func() {
        for v := range ch {
            fmt.Println("получил", v)
        }
        fmt.Println("канал закрыт")
        close(done)
    }()
    for i := 1; i <= 2; i++ {
        ch <- i
    }
    close(ch)
    <-done
    fmt.Println("готово")
}

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

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

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

Коротко

Код выведет: получил 1, получил 2, канал закрыт, готово. Отправка в небуферизованный канал завершается, только когда получатель забрал значение, поэтому «получил» печатается для каждого значения по порядку.

Что выведет

получил 1
получил 2
канал закрыт
готово

Разбор

Отправка в небуферизованный канал завершается, только когда получатель забрал значение, поэтому «получил» печатается для каждого значения по порядку. После close цикл range завершается, горутина закрывает done, и main печатает последнюю строку.

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

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