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