Ответ
При использовании defer внутри цикла, анонимная функция захватывает переменные по ссылке, а не по значению. Это значит, что к моменту выполнения defer будет использовано последнее значение переменной цикла.
Пример:
for i := 0; i < 3; i++ {
defer func() {
fmt.Println(i) // Всегда выведет 3 (последнее значение i)
}()
}
Решение: передать переменную как аргумент, чтобы зафиксировать значение:
for i := 0; i < 3; i++ {
defer func(val int) {
fmt.Println(val) // Выведет 2, 1, 0
}(i)
}