🟡 Средний · 2 очк. Горутины и конкурентность
Что выведет: for i := 0; i < 3; i++ { go func() { fmt.Print(i) }() } (до Go 1.22)?
A 012
B 333
C Непредсказуемо, но скорее всего 333
D Ошибка компиляции
Объяснение вопроса

До Go 1.22 замыкание захватывало переменную i по ссылке. К моменту выполнения горутин цикл обычно уже завершён, i == 3. Поэтому чаще всего вывод - 333 (или другой порядок троек).

for i := 0; i < 3; i++ {
    go func() { fmt.Print(i) }()
}
time.Sleep(time.Second)
// Вывод: 333 (или 332, 323 - гонка)

Правильный способ (до 1.22)

for i := 0; i < 3; i++ {
    i := i  // или передать аргументом
    go func() { fmt.Print(i) }()
}
// или
for i := 0; i < 3; i++ {
    go func(n int) { fmt.Print(n) }(i)
}

С Go 1.22 переменная цикла создаётся заново на каждой итерации (как отдельная переменная), поэтому замыкание захватывает правильное значение без дополнительного i := i.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.