Проверяет понимание захвата переменных в замыканиях горутин и способов избежать состояния гонки в Go.
В Go переменная, объявленная в цикле for, переиспользуется на каждой итерации. Если запустить горутину внутри цикла и использовать эту переменную напрямую, все горутины увидят одно и то же значение — последнее присвоенное после завершения цикла. Это классическая проблема гонки данных (race condition).
Самый простой способ — передать переменную цикла как аргумент горутины. В Go аргументы копируются при запуске горутины, поэтому каждая получит свою копию:
for i := 0; i < 5; i++ {
go func(val int) {
fmt.Println(val)
}(i)
}Другой вариант — создать локальную переменную внутри цикла:
for i := 0; i < 5; i++ {
i := i // создаём копию
go func() {
fmt.Println(i)
}()
}Это работает, потому что на каждой итерации создаётся новая переменная i.
Используйте передачу аргумента или локальную копию, чтобы избежать гонки данных при работе с горутинами в циклах. Это обязательная практика для безопасного конкурентного кода в Go.