Какой вывод получит программа №34

Второй цикл записан с синтаксической ошибкой. После замены на for range values программа получит три значения; их порядок не гарантирован и зависит от семантики переменной v.

Короткий ответ

Что ответить на собеседовании

Второй цикл записан с синтаксической ошибкой. После замены на for range values программа получит три значения; их порядок не гарантирован и зависит от семантики переменной v.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой текст будет выведен в консоль после выполнения следующей программы.

func main() {
    num :=make(chan int)

    values := []int{1, 2, 3}
    for _, v:=range values {
        go func () {
            num <- v
        }()
    }
    
    for _, = range values {
        fmt.Println(<-num)
    }
}

Ответ

Второй цикл записан с синтаксической ошибкой. После замены на for range values программа получит три значения; их порядок не гарантирован и зависит от семантики переменной v.

Для режима языка Go 1.22+ каждая итерация имеет собственную v, поэтому будут 1, 2, 3 в некотором порядке. При старой семантике возникает гонка по общей переменной, и результат не фиксирован. Универсальное исправление отправителя: go func(value int) { num <- value }(v). Три чтения обеспечат ожидание всех отправок, а закрытие канала для такого фиксированного количества чтений не обязательно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее