Ответ
Декларативное программирование — это парадигма, в которой вы описываете что хотите получить в результате, а не как этого достичь. Это контрастирует с императивным подходом (как в Go, C++, Java), где вы пошагово описываете алгоритм действий.
Основные примеры декларативных языков и технологий:
-
SQL (язык структурированных запросов)
- Вы описываете, какие данные вам нужны (
SELECT name FROM users WHERE age > 30), но не указываете, как базе данных их искать, сканировать таблицы или использовать индексы. Это решает сама СУБД.
- Вы описываете, какие данные вам нужны (
-
HTML/CSS
- HTML описывает структуру документа (что на странице есть заголовок, абзац, список), а CSS — правила его отображения (какого цвета должен быть текст, какие отступы). Вы не пишете код для отрисовки пикселей на экране.
-
Языки конфигурации (IaC - Infrastructure as Code)
- Terraform (HCL), Kubernetes (YAML), Ansible. Вы описываете желаемое состояние инфраструктуры (например, "нужен один сервер с такими-то параметрами и одна база данных"), а инструмент сам определяет, какие действия нужно выполнить, чтобы привести систему в это состояние.
-
Функциональные языки
- Языки вроде Haskell или Lisp часто относят к декларативным, так как программа состоит из описания функций и их взаимосвязей, а не из последовательности команд, изменяющих состояние.
Где с этим сталкивается Go-разработчик?
Хотя Go — это в первую очередь императивный язык, backend-разработчик на Go постоянно работает с декларативными системами:
- Взаимодействие с базами данных через SQL.
- Работа с DevOps-инструментами: написание YAML-манифестов для Kubernetes или Docker Compose, конфигураций для CI/CD.
- Создание шаблонов: использование пакета
html/templateдля генерации HTML-страниц, где сам шаблон является декларативным описанием итогового документа.
Ответ 18+ 🔞
Да ты посмотри, какая хуйня творится в мире! Сидишь ты, пишешь на Go, пошагово команды отдаёшь, как робот: "сделай это, потом проверь то, потом запиши сюда". А оказывается, есть целая вселенная, где ты просто заказываешь результат, как в ресторане — "мне салат, но без лука", а как повар там на кухне крошит, тебе похуй. Это и есть декларативное программирование, ёпта!
Вот смотри, живые примеры, чтобы не ебал мозг теорией:
-
SQL — это ж классика! Ты пишешь: "Дай мне имена всех юзеров, которым за 30". И всё. Ты не бегаешь по таблицам с фонариком, не говоришь базе: "А теперь открой первую строку, посмотри возраст, если подходит — скопируй имя в ведро". Нет, ты просто заказал. А база уже сама решает, через какие индексы прыгать, в каком порядке данные жрать. Красота, блядь!
-
HTML/CSS — вообще пиздец как декларативно. Ты пишешь в HTML: "тут будет заголовок, тут кнопка". В CSS: "а кнопка эта, блядь, пусть будет синяя и с закруглёнными краями". И браузер, этот долбоёб, сам всё рисует. Ты же не пишешь код, который говорит: "Начни с координат (10,10), нарисуй прямоугольник шириной 100 пикселей, залей его градиентом...". Представил? Да я бы с ума сошел!
-
Вся эта DevOps-хуйня — Terraform, Kubernetes. Тут вообще цирк. Ты пишешь в YAML файлике: "Хочу 5 подов, чтобы у каждого было 2 гига памяти и они общались с этой базой". И всё. А система, эта мартышлюшка, сама бегает, смотрит — ага, сейчас только 3 пода, надо ещё 2 слепить. Или один сдох — она ему нового клонирует. Ты не управляешь процессом, ты объявляешь желаемое. Как король, блядь: "Хочу, чтобы в моём королевстве был мир и 5 подов!". А как именно паханы на местах этот мир обеспечивают — это их проблемы.
-
Функциональные языки — Haskell там, Lisp. Это для совсем ебнутых, но идея та же. Ты больше описываешь, что такое "хорошо" и как данные связаны, а не как их тыкать палкой, чтобы они превратились в результат.
А где это всё Go-разработчику встречается, спросишь ты?
Да везде, сука! Хоть Go и язык императивный, "делай-раз-два", но он же живёт не в вакууме.
- Базы данных — любой нормальный бекенд лезет в базу. И как он это делает? Правильно, пишет SQL-запрос — чистейшей воды декларативную хуйню посреди своего императивного кода.
- DevOps и развертывание — если ты не конченый динозавр, то ты хоть раз видел эти
deployment.yaml,docker-compose.yml. Ты в них и описываешь, ЧТО ты хочешь от кластера. Это и есть декларативная конфигурация, ебать её в сраку. - Шаблоны (templates) — пакет
html/templateв Go. Ты создаёшь файл, где декларативно описываешь: "Вот тут будет заголовок, вот тут список, а данные подставятся вот сюда". А потом просто выполняешь шаблон с данными. Ты не строишь HTML строку вручную черезfmt.Sprintf, ты описываешь конечный вид.
Короче, суть в чём: как бы ты ни любил в Go всё контролировать и явно прописывать каждый шаг, мир вокруг тебя давно живёт по принципу "опиши цель и получи результат". И игнорировать это — всё равно что пытаться собрать IKEA, не глядя на картинку, а только читая текст "поверни деталь Б нахуй в сторону детали А". Иногда проще просто показать на картинку и сказать: "Хочу как тут, блядь!".