Вывод значений i из горутин с захватом переменной

Полный вывод не гарантирован: main не ждёт горутины. Для Go 1.22+ каждая итерация данного цикла имеет своё i, но порядок остаётся произвольным.

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

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

Полный вывод не гарантирован: main не ждёт горутины. Для Go 1.22+ каждая итерация данного цикла имеет своё i, но порядок остаётся произвольным.

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

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

Условие

Определите, какие числа напечатает программа, учитывая поведение замыкания переменной i при параллельном запуске горутин.

func main() {
  for i := 0; i < 10; i++ {
    go func() {
      fmt.Println(i)
    }()
  }
}

Ответ

Полный вывод не гарантирован: main не ждёт горутины. Для Go 1.22+ каждая итерация данного цикла имеет своё i, но порядок остаётся произвольным.

В старом режиме языка i общая, и её чтение замыканием конкурирует с изменением в цикле; ответ «десять десяток» не гарантирован. Передайте i аргументом и используйте WaitGroup для ожидания. Новые правила не распространяются на переменную, объявленную снаружи и только присваиваемую циклом.

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

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

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

Подробнее