Defer откладывает выполнение функции до выхода из текущей функции. Классика — defer file.Close() сразу после открытия файла: что бы ни случилось дальше, файл закроется. Defer работает по LIFO — последний отложенный выполнится первым. Аргументы вычисляются в момент defer, а не в момент выполнения. Работает даже при панике, поэтому используется для cleanup: закрыть соединение, разлочить мьютекс, откатить транзакцию.