for i := 0; i < 3; i++ { go func() { fmt.Print(i) }() } (до Go 1.22)?До Go 1.22 замыкание захватывало переменную i по ссылке. К моменту выполнения горутин цикл обычно уже завершён, i == 3. Поэтому чаще всего вывод - 333 (или другой порядок троек).
for i := 0; i < 3; i++ {
go func() { fmt.Print(i) }()
}
time.Sleep(time.Second)
// Вывод: 333 (или 332, 323 - гонка)
for i := 0; i < 3; i++ {
i := i // или передать аргументом
go func() { fmt.Print(i) }()
}
// или
for i := 0; i < 3; i++ {
go func(n int) { fmt.Print(n) }(i)
}
С Go 1.22 переменная цикла создаётся заново на каждой итерации (как отдельная переменная), поэтому замыкание захватывает правильное значение без дополнительного i := i.