Полный вывод не гарантирован: main не ждёт горутины. Для Go 1.22+ каждая итерация данного цикла имеет своё i, но порядок остаётся произвольным.
Вывод значений 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 для ожидания. Новые правила не распространяются на переменную, объявленную снаружи и только присваиваемую циклом.