Какие значения для анонимной функции получатся при объявлении Defer внутри цикла

«Какие значения для анонимной функции получатся при объявлении Defer внутри цикла» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При использовании 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)
}