Category : golang

golang
Обрезание баз данных без боли — использование и реализация database subsets в Greenmask

Ключевой функционал GreenmaskПродолжаю цикл статей про использование Greenmask - инструмента, который написан на Go специально для безопасной работы с данными PostgreSQL: он помогает делать логические бэкапы, восстанавливать таблицы и при необходимости — анонимизировать чувствительную информацию.В первой части описаны базовые сценарии использования данного инструмента, а в этой части опишу что такое database subsets и как использовать данный функционал для радикального снижения размера дампа ба…

  • среда, 4 июня 2025 г. в 00:00:09
golang
Как я допилил аналог Google Sheets, чтобы хранить данные за пазухой

С 1 июля 2025 года хранить персональные данные россиян в иностранных сервисах больше нельзя. Назрел вопрос, что же делать, например, с регистрациями на мероприятия, которые так удобно складывались из формочек Tilda напрямую в Google Sheets без СМС и регистрации. В статье расскажу, как я эту задачу решил с помощью бесплатного open-source сервиса Grist, платного, но копеечного Яндекс Облака и сомнительного Go кода.Задача — натараканить self-hosted сервис для замены Google Sheets, чтобы также легк…

  • среда, 4 июня 2025 г. в 00:00:09
golang
Вы уверены, что defer всегда безопасен?

О себеПривет! Я Артур Давыдов, бэкенд разработчик на Go. В этой статье хочу рассмотреть поведение defer более детально. Надеюсь, что статья будет полезна.Смотрит на deferВведениеDefer это мощный инструмент в Go. Его можно (с огромной натяжкой) сравнить с деструкторами С++ или Finalizer в Dart, но происходит все действо в пределах стека одной функции. И этих вызовов может быть несколькоЭто базаDefer в Go перемещает вызов функции в стэк (LIFO очередь) отложенных вызовов. Другими словами, функции …

  • понедельник, 2 июня 2025 г. в 00:00:06
golang
Еще разок про gomock и функциональные тесты

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

  • понедельник, 2 июня 2025 г. в 00:00:06
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