Печать индексов из goroutine в цикле с захватом переменной

Нельзя гарантировать даже наличие строк: main завершается без ожидания горутин. Состав значений дополнительно зависит от режима языка, определяющего переменную цикла.

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

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

Нельзя гарантировать даже наличие строк: main завершается без ожидания горутин. Состав значений дополнительно зависит от режима языка, определяющего переменную цикла.

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

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

Условие

Требуется исследовать, как работают goroutine, запущенные внутри цикла, и предсказать, какие числа будут напечатаны, учитывая, что анонимная функция захватывает переменную цикла.

package main

import (
  "fmt"
)

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

Ответ

Нельзя гарантировать даже наличие строк: main завершается без ожидания горутин. Состав значений дополнительно зависит от режима языка, определяющего переменную цикла.

При Go 1.22+ idx, объявленная таким циклом, отдельная для каждой итерации; при старой семантике общая переменная создаёт гонку. Для переносимого кода передавайте idx аргументом анонимной функции и ждите все вызовы через WaitGroup. Даже после исправления числа 0–9 могут печататься в произвольном порядке.

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

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

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

Подробнее