Значение переменной передается в оператор defer в момент выполнения инструкции defer, а не в момент вызова функции.
Пример:
go
Вывод будет:
plaintext
Если бы значение передавалось в момент вызова функции, вывод был бы 1.
Теперь рассмотрим связь с именованными возвращаемыми значениями:
go
Вывод будет:
plaintext
В случае с именованным возвращаемым значением res, оператор defer получает доступ к этому именованному значению и может его модифицировать, потому что defer выполняется непосредственно перед возвратом из функции. Анонимная функция в defer захватывает переменную res по ссылке.
Если бы функция не использовала именованный возврат или defer модифицировал бы локальную переменную, результат был бы другим.
go
Вывод будет:
plaintext
Именованные возвращаемые значения по сути являются переменными, объявленными в начале функции, что позволяет defer с ними взаимодействовать.