Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: FIFO, LIFO, defer, stack, queue, golang

В чём отличие FIFO от LIFO? Как это соотносится с поведением defer?

Проверяет понимание базовых структур данных FIFO и LIFO и их связь с механизмом отложенного выполнения defer в Go.

Короткий ответ

FIFO (First In, First Out) — это очередь, где первый добавленный элемент обрабатывается первым. LIFO (Last In, First Out) — это стек, где последний добавленный элемент обрабатывается первым. В Go оператор defer использует LIFO-поведение: отложенные вызовы выполняются в обратном порядке их объявления, что удобно для освобождения ресурсов в порядке, обратном их захвату.

Длинный ответ

Основные понятия FIFO и LIFO

FIFO (First In, First Out) и LIFO (Last In, First Out) — это два фундаментальных принципа организации данных в структурах. FIFO работает как очередь в магазине: первый покупатель, который пришёл, первым и обслуживается. LIFO работает как стопка тарелок: последнюю поставленную тарелку берут первой.

Применение в программировании

FIFO часто используется в очередях задач, буферах и системах обмена сообщениями. LIFO лежит в основе стеков вызовов функций, алгоритмов обхода графов и механизмов отмены действий (undo).

Defer в Go и LIFO

В языке 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 для гарантированного освобождения ресурсов в обратном порядке их захвата.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Node.js

    Node.js

Ключевые слова

#FIFO

#LIFO

#defer

#stack

#queue

#golang

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.