Привет, Хабр!Сегодня разберём, как устроен reflect.Value изнутри и что на происходит, когда вы вызываете .Field(i). Что прячется в reflect.Value — и как это связано с вашей памятьюКогда вы пишете в коде reflect.ValueOf(x), вам возвращается объект, внутри которого — по сути, три вещи:type Value struct { typ_ *abi.Type // описание типа (reflect.Type — это обёртка вокруг) ptr unsafe.Pointer // указатель на данные, которые мы отражаем flag flag // битовая маска, определя…
В данной статье представлен авторский подход к унификации и централизации механизма обработки ошибок в HTTP-обработчиках веб-сервисов, разработанных на языке Go. Статья подробно рассматривает ограничения традиционных методов обработки ошибок, ведущие к дублированию кода и снижению поддерживаемости. Предлагается новый архитектурный паттерн, включающий использование специализированной сигнатуры функций-обработчиков, кастомного типа ошибки HTTPError для инкапсуляции статуса ответа, сообщения для к…
Привет, Хабр!В статье рассмотрим, как реализовать Template Method-паттерн в Go без наследования, зачем он вообще нужен.Что делает Template Method и зачем он в бизнес-логикеКлассическая формулировка: «Определяет скелет алгоритма в базовом классе, перекладывая реализацию отдельных шагов на наследников». В CRUD-жизни разработчика это:Жёсткий инвариант — шаги алгоритма должны идти именно в таком порядке: например, валидировать > рассчитать > сгенерировать PDF.Гибкие детали — как конкретно вал…
Go — язык, который ценится за простоту и чёткость. Однако даже при минимальном синтаксисе здесь есть нюансы. Особенно это касается работы с функциями и методами. В этой небольшой статье хочу поделиться личными наблюдениями и выводами по нескольким ключевым темам: выбор типа получателя, использование именованных параметров результата, распространённые ошибки при возврате nil, проблемы с файлами в качестве входных данных и поведение defer.Получатель значения или указателя?Одна из первых вещей, к…
арты нейросетиЯ думаю, что многие, кто занимается разработкой в стеке Go + PgBouncer + PostgreSQL, уже примерно поняли, о чём будет статья — о проблеме выполнения prepared statements и сравнении работы двух популярных драйверов для PostgreSQL: lib/pq и jackc/pgx.Если интересно — добро пожаловать под кат.🧨 Описание проблемы1. Одной стороны — PgBouncerPgBouncer создаёт ограниченный пул соединений к PostgreSQL и переиспользует их между клиентами, которых может быть в разы больше. Существует 3 режи…
Привет, Хабр!Сегодня разберёмся, зачем Go-проекту слой Application / Use-Case: как он герметично изолирует бизнес-логику, позволяет переключаться между HTTP, gRPC, Cron-джобами и очередями, а заодно экономит тесты и нервные клетки. Где живёт слой Application?/internal /domain // сущности, политики /app // <-- наши use cases /adapters /http // delivery /cron /grpc /infra /postgres // репозитории, external clients /…
В настоящее время резко возрос спрос на контейнеры, используемые в продакшене для эксплуатации больших энтерпрайз-приложений. Как правило, они развёртываются в Docker. Docker де-факто стал основной технологией для работы с контейнеризованными приложениями. Но на основе чего он построен? Как он контейнеризует приложения? В данной статье постараемся ответить на эти вопросы. ❯ Зачем нужны контейнерыПрежде, чем поговорить о контейнерах, давайте разберёмся, что такое процесс.Процесс создаётся, когда…
ДисклеймерВсем привет! В данной статье я поделюсь своим опытом написания сервиса. Я не являюсь опытным или профессиональным разработчиком, я пишу свой проект и мои решения могут быть не самыми оптимальными. Эта статья состоит в основном из моих решений при написании сервиса, что могут быть не идеальными. Мой путь не является правильным и потому - судите "строго". Так же порекомендую прочитать предыдущие мои статьи.)Новая архитектура проектаПосле совершения множества ошибок, я решил слег…
Забудьте о том, что Docker — это некий таинственный инструмент исключительно для DevOps-инженеров. В современном мире разработки Docker стал таким же незаменимым швейцарским ножом, как Git или ваш любимый редактор кода. Он позволяет любому разработчику писать код, который будет одинаково работать на машине коллеги, на тестовом стенде и в продакшене, забыв о кошмаре "а у меня на машине все работает". Если вы еще не погрузились в мир контейнеризации или вам нужен удобный источник команд, …