Category : golang

golang
Как устроен reflect.Value и что происходит, когда вы вызываете .Field(i)

Привет, Хабр!Сегодня разберём, как устроен reflect.Value изнутри и что на происходит, когда вы вызываете .Field(i). Что прячется в reflect.Value — и как это связано с вашей памятьюКогда вы пишете в коде reflect.ValueOf(x), вам возвращается объект, внутри которого — по сути, три вещи:type Value struct { typ_ *abi.Type // описание типа (reflect.Type — это обёртка вокруг) ptr unsafe.Pointer // указатель на данные, которые мы отражаем flag flag // битовая маска, определя…

  • воскресенье, 1 июня 2025 г. в 00:00:05
golang
Архитектурный паттерн для централизованной обработки ошибок в хендлерах на Go

В данной статье представлен авторский подход к унификации и централизации механизма обработки ошибок в HTTP-обработчиках веб-сервисов, разработанных на языке Go. Статья подробно рассматривает ограничения традиционных методов обработки ошибок, ведущие к дублированию кода и снижению поддерживаемости. Предлагается новый архитектурный паттерн, включающий использование специализированной сигнатуры функций-обработчиков, кастомного типа ошибки HTTPError для инкапсуляции статуса ответа, сообщения для к…

  • суббота, 31 мая 2025 г. в 00:00:09
golang
Template Method в Go без наследования

Привет, Хабр!В статье рассмотрим, как реализовать Template Method-паттерн в Go без наследования, зачем он вообще нужен.Что делает Template Method и зачем он в бизнес-логикеКлассическая формулировка: «Определяет скелет алгоритма в базовом классе, перекладывая реализацию отдельных шагов на наследников». В CRUD-жизни разработчика это:Жёсткий инвариант — шаги алгоритма должны идти именно в таком порядке: например, валидировать > рассчитать > сгенерировать PDF.Гибкие детали — как конкретно вал…

  • суббота, 31 мая 2025 г. в 00:00:08
golang
Функции и методы в Go

Go — язык, который ценится за простоту и чёткость. Однако даже при минимальном синтаксисе здесь есть нюансы. Особенно это касается работы с функциями и методами. В этой небольшой статье хочу поделиться личными наблюдениями и выводами по нескольким ключевым темам: выбор типа получателя, использование именованных параметров результата, распространённые ошибки при возврате nil, проблемы с файлами в качестве входных данных и поведение defer.Получатель значения или указателя?Одна из первых вещей, к…

  • суббота, 31 мая 2025 г. в 00:00:08
golang
Бесполезная статья. SimpleProtocol vs BinaryParameters

арты нейросетиЯ думаю, что многие, кто занимается разработкой в стеке Go + PgBouncer + PostgreSQL, уже примерно поняли, о чём будет статья — о проблеме выполнения prepared statements и сравнении работы двух популярных драйверов для PostgreSQL: lib/pq и jackc/pgx.Если интересно — добро пожаловать под кат.🧨 Описание проблемы1. Одной стороны — PgBouncerPgBouncer создаёт ограниченный пул соединений к PostgreSQL и переиспользует их между клиентами, которых может быть в разы больше. Существует 3 режи…

  • пятница, 30 мая 2025 г. в 00:00:12
golang
Application Layer на примере Go — зачем он нужен, если уже есть сервисы?

Привет, Хабр!Сегодня разберёмся, зачем Go-проекту слой Application / Use-Case: как он герметично изолирует бизнес-логику, позволяет переключаться между HTTP, gRPC, Cron-джобами и очередями, а заодно экономит тесты и нервные клетки. Где живёт слой Application?/internal /domain // сущности, политики /app // <-- наши use cases /adapters /http // delivery /cron /grpc /infra /postgres // репозитории, external clients /…

  • пятница, 30 мая 2025 г. в 00:00:11
golang
Контейнер с нуля

В настоящее время резко возрос спрос на контейнеры, используемые в продакшене для эксплуатации больших энтерпрайз-приложений. Как правило, они развёртываются в Docker. Docker де-факто стал основной технологией для работы с контейнеризованными приложениями. Но на основе чего он построен? Как он контейнеризует приложения? В данной статье постараемся ответить на эти вопросы. ❯ Зачем нужны контейнерыПрежде, чем поговорить о контейнерах, давайте разберёмся, что такое процесс.Процесс создаётся, когда…

  • пятница, 30 мая 2025 г. в 00:00:10
golang
Моё автопротоколирование, создание полифункционального сервиса

ДисклеймерВсем привет! В данной статье я поделюсь своим опытом написания сервиса. Я не являюсь опытным или профессиональным разработчиком, я пишу свой проект и мои решения могут быть не самыми оптимальными. Эта статья состоит в основном из моих решений при написании сервиса, что могут быть не идеальными. Мой путь не является правильным и потому - судите "строго". Так же порекомендую прочитать предыдущие мои статьи.)Новая архитектура проектаПосле совершения множества ошибок, я решил слег…

  • пятница, 30 мая 2025 г. в 00:00:09
golang
Docker на каждый день: Ключевые команды в одной статье-шпаргалке

Забудьте о том, что Docker — это некий таинственный инструмент исключительно для DevOps-инженеров. В современном мире разработки Docker стал таким же незаменимым швейцарским ножом, как Git или ваш любимый редактор кода. Он позволяет любому разработчику писать код, который будет одинаково работать на машине коллеги, на тестовом стенде и в продакшене, забыв о кошмаре "а у меня на машине все работает". Если вы еще не погрузились в мир контейнеризации или вам нужен удобный источник команд, …

  • пятница, 30 мая 2025 г. в 00:00:08