defer откладывает вызов функции до выхода из текущей функции. Аргументы вычисляются сразу при объявлении, но сам вызов происходит только при return или panic.
Несколько defer выполняются в обратном порядке — стек (LIFO). Последний defer выполнится первым.
Типичные кейсы — закрытие файлов, разблокировка мьютексов, закрытие соединений БД.
f, _ := os.Open("file.txt")
defer f.Close()
mu.Lock()
defer mu.Unlock()
Важный нюанс: defer в цикле — плохая практика. Ресурсы не освобождаются до выхода из функции, и если цикл большой — всё накопится в памяти. Решение — вынести тело цикла в отдельную функцию.