Когда увидел еще одну статью про то как писать тестыЗа несколько лет разработки меня заносило на проекты абсолютно разной направленности. Когда-то я сам с энтузиазмом вписывался в это дело, когда-то с энтузиазмом вписывали меня. И на всех проектах тестирование руками разработки было болью, после которой любой нормальный разработчик не мог смотреть на эти гребанные надоевшие тесты.В этой статье я хотел бы дать вам рецепт, как меньше страдать при написании тестов, шаг за шагом увеличивая тестовое…
Привет, Хабр!Сегодня разберём, как устроен 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 де-факто стал основной технологией для работы с контейнеризованными приложениями. Но на основе чего он построен? Как он контейнеризует приложения? В данной статье постараемся ответить на эти вопросы. ❯ Зачем нужны контейнерыПрежде, чем поговорить о контейнерах, давайте разберёмся, что такое процесс.Процесс создаётся, когда…
ДисклеймерВсем привет! В данной статье я поделюсь своим опытом написания сервиса. Я не являюсь опытным или профессиональным разработчиком, я пишу свой проект и мои решения могут быть не самыми оптимальными. Эта статья состоит в основном из моих решений при написании сервиса, что могут быть не идеальными. Мой путь не является правильным и потому - судите "строго". Так же порекомендую прочитать предыдущие мои статьи.)Новая архитектура проектаПосле совершения множества ошибок, я решил слег…