Проблема, которую решает pgxWrappyКак разработчик на Go, я долгое время использовал pgx - безусловно, лучший драйвер для PostgreSQL. Но каждый раз, когда нужно было сканировать результаты запроса в структуры, особенно со сложной вложенностью, приходилось писать много шаблонного кода. Это отнимало время и делало код менее читаемым.После десятков проектов с pgx я решил создать решение, которое сохраняет все преимущества оригинального драйвера, но избавляет от рутинных операций.Ключевые возможност…
Я не считаю себя специалистом по Go и лишь изредка обращался к этому языку, но хочу поделиться историей об одном баге на стыке Go и ядра Windows, с которым мне «посчастливилось» столкнуться.Баг до сих пор остаётся актуальным (issue на GitHub), хотя есть основания надеяться, что он будет исправлен в следующем релизе Go.Тем не менее, если звёзды сойдутся неудачно и ваша программа на Go внезапно зависнет у клиента в вызове CancelIoEx, а воспроизвести и проанализировать проблему не удастся, то, над…
Я сделал резервную копию через pg_dump и восстановился из неё 21 раза. Резервные копии делал в 4 разных форматах с использованием от 1 до 7 уровней сжатия под каждый формат. Записал результаты и сделал сравнение разных видов, чтобы понимать, какие способы более эффективны для моего сценария использования.Детали и замеры — ниже.СодержаниеЗачем мне этот замер?О форматах резервных копий и видах сжатия в pg_dumpНастройка PostgreSQLПодготовка данныхРезультаты замеровВыводы, исходя из размеровЗаключе…
Я работаю программистом последние 11 лет: первые 5 лет как PHP-разработчик, а последние 6 лет как Go-разработчик. Недавно я сходил на с десяток собеседований, и они меня очень сильно разочаровали.Хватит спрашивать тонкости языка программированияВопросы вроде: "Вот у нас есть слайс в Go, мы передадим его в функцию, там вставим 3 элемента - что мы получим?" Да ерунду вы получите! Есть best practices. Если в функции модифицируете слайс - нужно возвращать новый слайс, а не играть в угадайку…
Всем привет! Кажется, настало время поговорить о том, как внедрялись ограничители частоты запросов на бэкенд в Wildberries. В статье — о том, с какими трудностями мы столкнулись на этом благородном пути и как прошли через четыре схемы реализации — от простейшей in-memory до собственных gRPC-сервисов. Не обойдём вниманием и парочку лайфхаков ;) Например, с помощью рейтлимитов мы неожиданно решили проблему плавного отключения старых версий API.Немного обо мне. Меня зовут Дмитрий Виноградов, и я л…
Данная статья - это вырезка из книги Джона Боднера под названием "Go идиомы и паттерны проектирования". На момент чтения 14-й главы, посвященной теме контекста, мне показался полезным её подраздел про работу со значениями посредством контекста. Полезным в том смысле, что этот подраздел вполне может служить справкой для новичков сам по себе, взятый автономно из содержащей его книги. Справкой по конкретному вопросу чтения и записи значений из контекста, разумеется, а не обозревающей тему …
Проблема CRUD-подхода// Проблемы: // 1. История изменений теряется // 2. Конфликты при конкурентных обновлениях (или использование блокировок) func UpdateOrderStatus(orderID string, status Status) error { return db.Exec("UPDATE orders SET status=? WHERE id=?", status, orderID) }Решение: CQRS и Event SourcingАрхитектурное ядроАрхитектураКлючевые компоненты архитектуры1. Команда (Command)Запрос на выполнение действия ("Завершить заказ", "Списать средства")Компонент на …
PolyJSONПолиморфная сериализация JSON — частая задача при проектировании API, UI-моделей или событийных структур. Пример структуры:[ {"type": "text", "content": "hello"}, {"type": "image", "url": "pic.jpg"} ]В Go такие данные принято представлять с помощью интерфейсов. Однако стандартный пакет encoding/json не умеет автоматически сериализовать и десериализовать структуры с полем-дискриминатором (например, "type"), котор…
🚀 Запарило ручное сканирование в pgx? Встречайте pgxWrappy - супер-удобную обертку для PostgreSQL в Golang! 🐘💨🔥 Больше никакого boilerplate-кода!// 🚫 БЫЛО (кошмар на 10 строк): rows, _ := conn.Query(ctx, "SELECT id, name FROM users") defer rows.Close() var users []User for rows.Next() { var u User rows.Scan(&u.ID, &u.Name) users = append(users, u) } // ✅ СТАЛО (магия в 1 строку!): var users []User db.Select(ctx, &users, "SELECT id, name FROM users") // ✨…