Нельзя гарантировать даже наличие строк: main завершается без ожидания горутин. Состав значений дополнительно зависит от режима языка, определяющего переменную цикла.
Печать индексов из goroutine в цикле с захватом переменной
Нельзя гарантировать даже наличие строк: 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 могут печататься в произвольном порядке.