Проверяет понимание порядка выполнения отложенных вызовов defer в Go, что важно для корректного управления ресурсами и очистки.
В языке Go оператор defer откладывает выполнение функции до момента возврата из текущей функции. Когда в одной функции объявлено несколько defer, они помещаются в стек и выполняются в обратном порядке — по принципу LIFO (Last In, First Out). Это означает, что последний объявленный defer выполнится первым, а первый — последним.
Такое поведение специально спроектировано в языке, чтобы упростить управление ресурсами. Например, если вы открываете несколько файлов или соединений, вы можете объявить их закрытие сразу после открытия, и они закроются в правильном порядке — в обратном порядке открытия, что часто соответствует логике вложенных ресурсов.
package main
import "fmt"
func main() {
defer fmt.Println("первый")
defer fmt.Println("второй")
defer fmt.Println("третий")
fmt.Println("основной код")
}
// Вывод:
// основной код
// третий
// второй
// первыйВ этом примере сначала выполняется основной код, затем вызываются отложенные функции в обратном порядке: сначала «третий», потом «второй», и в конце «первый».
Чаще всего defer используется для закрытия файлов, разблокировки мьютексов, закрытия соединений с базой данных или HTTP-ответов. Благодаря LIFO-порядку, если вы открываете ресурсы вложенно, они будут закрыты в правильной последовательности, что предотвращает утечки и ошибки.
Важно помнить, что аргументы отложенной функции вычисляются в момент объявления defer, а не в момент её выполнения. Это может привести к неожиданным результатам, если вы передаёте изменяемые переменные.
Используйте defer для гарантированной очистки ресурсов. Порядок LIFO позволяет естественно управлять вложенными ресурсами, делая код более читаемым и безопасным. Это одна из ключевых идиом Go, которую стоит применять в любом месте, где требуется отложенное действие.