Второй цикл записан с синтаксической ошибкой. После замены на for range values программа получит три значения; их порядок не гарантирован и зависит от семантики переменной v.
Какой вывод получит программа №34
Второй цикл записан с синтаксической ошибкой. После замены на 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). Три чтения обеспечат ожидание всех отправок, а закрытие канала для такого фиксированного количества чтений не обязательно.