Про defer в Go до сих пор ходит миф: «он медленный, в горячем коде лучше не использовать». Когда-то это было правдой. До Go 1.13 каждый defer означал аллокацию в куче. Сейчас, в большинстве случаев, он стоит почти ничего. Но «в большинстве» — это не «всегда», и граница проходит по довольно конкретным правилам.
Компилятор Go умеет реализовывать defer тремя способами:
-
open-coded — никакой runtime-структуры, вызов вставляется прямо в код функции;
-
stack defer — runtime используется, но запись о
deferлежит на стеке; -
heap defer — запись аллоцируется в куче.



