Telegram Group Search
SOLID в Go и щепотка паттернов

Как сказал бы волк из небезызвестного мультика: «SOLID? Шо, опять?»

Но наша сфера пополняется новыми кадрами, и для них это всё действительно впервые. Именно для них я и написал эту статью. Недавно мне пришлось объяснять принципы SOLID начинающему разработчику на примере Go, и я понял, что нет хорошего материала, который я мог бы ему рекомендовать. Точнее, нет материала, который объяснял бы эти принципы так, как я это себе представляю, максимально понятно. Часто объяснения SOLID сводятся к разбору каждого принципа отдельно. Однако, по моему мнению, настоящее понимание приходит, когда ты видишь, как реализация одного принципа в коде неизбежно приводит к применению второго и третьего.

https://habr.com/ru/companies/domclick/articles/816885/

👉 @golang_lib
Как я отправил 500 миллионов HTTP-запросов менее чем за 24 часа

Недавно я решил поэкспериментировать с отправкой большого количества HTTP-запросов за короткое время. Мне было любопытно, насколько далеко можно зайти, не нарушая правил приличия — без DDoS, без кражи ресурсов, просто ради эксперимента. В результате мне удалось отправить 500 миллионов запросов менее чем за 24 часа. В этом посте я объясню, как я это сделал и какие технологии использовал.

Цели и ограничения

* Не нарушать закон и правила приличия
* Не навредить чужим сервисам
* Минимальные затраты
* Использовать только бесплатные или дешевые решения

https://www.moczadlo.com/2024/how-i-sent-500-million-http-requests-in-under-24h

👉 @golang_lib
🤖 Хотите создать Telegram-бота с нуля на Go?

📅 13 мая в 20:00 МСК на открытом вебинаре мы разберем, как создать простого, но эффективного Telegram-бота для управления задачами, а также заложим правильную архитектуру для его дальнейшего расширения.

❗️Что разберем:

— Принципы разработки Telegram-ботов на Go.

— Архитектуру и структуры данных.

— Реализацию минимального набора функций для бота.

➡️ Открытый урок проходит в преддверие старта курса «Go (Golang) Developer Basic». Все участники получат скидку на обучение. Запишитесь прямо сейчас: https://vk.cc/cLEkuD

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔧 Локальное исправление зависимостей в Go

Иногда при разработке на Go возникает необходимость временно изменить внешний модуль — например, внести исправление, которое ещё не вмержили в основной репозиторий. Go предоставляет удобный механизм для этого.

🧩 Используем replace в go.mod

В Go можно использовать директиву replace, чтобы указать локальный путь вместо внешней зависимости:


replace github.com/some/module => ../local-copy/module


Теперь при сборке Go будет использовать код из ../local-copy/module вместо кода, загружаемого из Git.

Это особенно удобно, если вы:

* работаете над фиксом бага во внешнем пакете;
* тестируете pull request;
* занимаетесь временным форком библиотеки.

⚠️ Что важно помнить

1. Не коммитьте replace в main ветку!
Эти изменения локальны и не должны попадать в боевой код.

2. go get не влияет на replace
Даже если вы обновите модуль через go get, replace всё равно будет использовать локальный путь.

3. Проверьте go.sum
После замены зависимостей могут измениться хэши в go.sum. Это нормально, но стоит за этим следить.

🛠 Пример сценария

Вы нашли баг в github.com/example/lib, клонировали его:


git clone https://github.com/example/lib ~/dev/lib-patched


Затем в go.mod вашего проекта:


replace github.com/example/lib => ~/dev/lib-patched


Теперь go build будет использовать вашу локальную версию.

https://eli.thegreenplace.net/2024/locally-patching-dependencies-in-go/

👉 @golang_lib
Использование Profile-Guided Optimization (PGO) для ваших Go-приложений

Профилируемая оптимизация (PGO) — это мощный способ улучшить производительность вашего программного обеспечения с минимальными изменениями в коде. Начиная с Go 1.21, поддержка PGO встроена в компилятор Go, что позволяет разработчикам собирать и использовать профиль выполнения своего приложения, чтобы сгенерировать более производительный бинарник.

Как это работает?

PGO использует реальные данные о выполнении приложения (runtime profile), чтобы направить оптимизации компилятора. Это позволяет, например, более эффективно размещать горячие (часто используемые) функции и блоки кода, улучшая производительность CPU и уменьшая кэш-промахи.

Как начать?

1. Соберите профиль выполнения. Используйте -cpuprofile, pprof или инструменты трассировки для сбора профиля вашего приложения в реальных условиях или нагрузочном тесте.

2. Скомпилируйте с использованием профиля. Передайте профиль компилятору с флагом -pgoprofile=your.pprof при сборке:


go build -gcflags=all=-pgoprofile=your.pprof


3. Измерьте результат. После повторной сборки вы получите бинарник, оптимизированный под реальные сценарии выполнения.

Результаты

По оценкам команды Go, использование PGO может дать прирост производительности от 2% до 20%, в зависимости от характера приложения. Это особенно полезно для серверных приложений с высокими требованиями к производительности.

Советы

* Снимайте профиль в наиболее репрезентативной среде — это поможет добиться наилучших результатов.
* Периодически обновляйте профиль, если поведение приложения или его нагрузка изменяются.
* Можно автоматизировать этот процесс в CI/CD.

https://cloud.google.com/blog/products/application-development/using-profile-guided-optimization-for-your-go-apps

👉 @golang_lib
💻Как работать с каналами в Go и сделать ваш код конкурентным?

🔥На открытом уроке «Использование каналов в Go на практике» от OTUS вы погрузитесь в одну из самых мощных особенностей языка Golang. Эти инструменты позволяют эффективно управлять параллельными процессами — ключ к созданию высокопроизводительных приложений.

❗️Что вас ждёт:

— Обзор теории: как работают каналы в Go и зачем они нужны.

— Практические примеры применения каналов в реальных задачах.

— Разбор частых ошибок и подводных камней при работе с каналами.

📗Урок пройдет в преддверии старта курса «Golang Developer. Professional», и все участники получат скидку на обучение.

➡️Встречаемся 14 мая в 20:00 МСК, регистрация открыта: https://vk.cc/cLRaXm

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Golang: bytes.Buffer изнутри

Работая с кодом на Go, любому специалисту приходилось сталкиваться со стандартным пакетом bytes . Внутри него лежит определение Buffer . Что же это такое?

Определение bytes.Buffer
Сам по себе bytes.Buffer является структурой.


type Buffer struct {
buf []byte // содержимое - это байты buf[off : len(buf)]
off int // читает по &buf[off], пишет по &buf[len(buf)]
lastRead readOp // последняя операция чтения, чтобы Unread* могло работать корректно
}


https://habr.com/ru/articles/827550/

👉 @golang_lib
SIMD Binary Search Tree

Этот проект представляет собой бинарное дерево поиска, реализованное с использованием SIMD-инструкций (SSE/AVX/AVX512).

Обычно бинарный поиск требует log₂(n) сравнений. Однако с SIMD можно сравнивать сразу несколько элементов за один проход, значительно снижая число итераций. Это приближает бинарный поиск к константному времени для малых массивов.

Особенности

* Однопроходный бинарный поиск с SIMD.
* Поддержка SSE, AVX2 и AVX512.
* Дерево хранится как массив (без указателей).
* Отложенная перестройка дерева (lazy rebuilding).
* Поддержка поиска и вставки.
* Поддержка произвольных типов через шаблоны C++.
* Совместимость с std::lower_bound / std::upper_bound.

Пример использования


#include "simd_binary_search_tree.hpp"

simd_tree::Tree<int> tree;
tree.insert(10);
tree.insert(5);
tree.insert(15);

auto result = tree.lower_bound(9); // -> 10


Производительность

Проект демонстрирует прирост производительности по сравнению со стандартными алгоритмами STL при поиске в небольших отсортированных массивах, особенно на AVX512.

Структура

* Tree<T> — основной шаблонный класс.
* insert(T) — вставка элемента.
* lower_bound(T) — найти первое значение не меньше заданного.
* upper_bound(T) — найти первое значение больше заданного.

https://clement-jean.github.io/simd_binary_search_tree/

👉 @golang_lib
🗂 Работа с базами данных на Go: как писать эффективные запросы и миграции?

📅 22 мая в 20:00 МСК на открытом уроке мы разберем, как эффективно работать с БД в Go, создавать таблицы, использовать ОRМ и SQL-запросы, а также научимся делать миграции.

Что вы узнаете:

— Как организовать структуру БД для веб-приложений.

— Применение ОRМ и чистого SQL в Go.

— Как правильно настроить миграцию и работать с таблицами.

➡️ Открытый урок пройдет в преддверие старта курса «Go (Golang) Developer Basic». Все участники получат 🎁 скидку на обучение. Не упустите шанс развить свои навыки в Go: https://vk.cc/cM5jdg

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Строки(strings) в Go

Строки — одна из самых часто используемых структур данных в любом языке программирования. И в Go они повсюду: от простых приветствий вроде "Hello, World!" до сложных парсеров, логгеров и сетевых протоколов. На первый взгляд, с ними всё просто: создал, склеил, обрезал — и пошёл дальше. Но как это часто бывает, под простотой скрываются тонкости, игнорирование которых может привести к ошибкам и снижению производительности.

Go предлагает мощные, но специфичные механизмы работы со строками. Они тесно связаны с понятиями Unicode, UTF-8, рун, неизменяемости и байтовых представлений. Понимание этих механизмов позволяет не только избежать типичных подводных камней, но и писать более эффективный код.

https://habr.com/ru/articles/911614/

👉 @golang_lib
Работа с аренами: почти избавляемся от GC

Меня зовут Максим Горозий. Я тимлид в Т-Банке, работаю над нашей образовательной платформой, которая служит для разных направлений бизнеса. В ИТ больше 10 лет и успел поработать в двух GameDev-компаниях, где управление памятью занимало весомое время в оптимизации производительности кода. Люблю строить системы и взаимосвязи между ними, а также EdTech и преподавание, а еще больше — работать над инструментами обучения. Хотя начинал с C, я идеологический фанат Go, DDD и Agile.

«Оно тормозит» — классическая цитата разработчиков. Расскажу, как разобраться в причинах и научиться управлять памятью, медитируя над профайлингом, чтобы все работало быстро.

https://habr.com/ru/companies/oleg-bunin/articles/828972/

👉 @golang_lib
🚀 Go — лучший старт для вашей карьеры в программировании.

🔎 Если вы хотите освоить один из самых востребованных языков разработки, не тратя времени на сложный синтаксис, Go — ваш идеальный выбор. Курс «Golang Developer. Basic» от OTUS — это возможность начать с нуля и научиться создавать эффективные приложения, веб-сервисы и системы.

Что вас ждёт:

— Легкость изучения и быстрая адаптация в Go.

— Применение best practices и реальных инструментов разработки.

— Основы разработки на Go и эффективное использование встроенных инструментов.

📖 Программа обновляется в соответствии с требованиями рынка. Диплом OTUS ценят ведущие IT-компании. Обучение ведут опытные преподаватели, работающие в реальных проектах.

😎 Старт курса — 29 мая.

🔴 Набор почти закрыт! Оставьте заявку и получите скидку на обучение: https://vk.cc/cMcnTS

Скидка 5% по промокоду: Go_05

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🚀 Go-профилирование как у профи!

🔍 Слишком медленно или жрёт кучу памяти? Эта статья расскажет, как:

1️⃣ Включить CPU- и heap-профилирование через runwww.tg-me.com/pprof
2️⃣ Анализировать .prof`-файлы командой `go tool pprof (topN, граф, list)
3️⃣ Оптимизировать парсинг и работу с данными: стриминг вместо загрузки всего в память, замена дорогих функций, упрощение структур
4️⃣ Профилировать живой сервер через net/http/pprof и ловить hot-spots «на ходу»

Результат: время работы сократилось с ~14 до ~7 секунд, память — с 1.7 ГБ до 57 МБ!

👉 Читай подробное пошаговое руководство

👉 @golang_lib
🚀 Открой для себя идеальный путь к лидерству с карьерным тестом от ОЭЗ «Алабуга»! 🌟

Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?

После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.

Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
Golang: context изнутри

Ни для кого не секрет, что стандартный пакет context широко используется для создания ваших сервисов. В данный момент, не побоюсь этого слова, любой сервис написанный на Go использует контексты повсеместно. Мое мнение таково - если ты хочешь прогрессировать как специалист, ты должен копать все глубже и глубже. Предлагаю рассмотреть context с призмы его работы внутри.

https://habr.com/ru/articles/827544/


Golang: bytes.Buffer изнутри

Работая с кодом на Go, любому специалисту приходилось сталкиваться со стандартным пакетом bytes . Внутри него лежит определение Buffer . Что же это такое?

https://habr.com/ru/articles/827550/


Golang: пакет bytes изнутри

Приветствую, в прошлой статье мы разбирали определение bytes.Buffer изнутри. Теперь хочется обратить внимание на сам пакет bytes. Что за ним скрывается? Каждому разработчику приходилось использовать его будь то в production или локальной разработке. Это достаточно мощный по своим меркам пакет, который предоставляет нам функции для работы с байтами.

https://habr.com/ru/articles/828044/

👉 @golang_lib
Вы уверены, что defer всегда безопасен?

В этой статье хочу рассмотреть поведение defer более детально. Данную статья пишется в целях "попробовать себя", а так же, надеюсь, помочь кому-то разобраться с defer.

https://habr.com/ru/articles/914642/

👉 @golang_lib
Анти-функциональные опции в Go

Часто в Go можно встретить такую конструкцию:


type Options struct {
Timeout time.Duration
Retries int
Logger *log.Logger
}

func DoSomething(ctx context.Context, opts Options) error {
if opts.Timeout == 0 {
opts.Timeout = 5 * time.Second
}
if opts.Retries == 0 {
opts.Retries = 3
}
if opts.Logger == nil {
opts.Logger = log.Default()
}

// дальше используем opts
}


На первый взгляд — удобно. Но на практике это ведёт к скрытым багам и неочевидному поведению. Почему?

🔸 Проблема 1: нулевое значение может быть валидным

Допустим, я хочу отключить ретраи и передаю Retries: 0. Но функция решает, что "ноль — это дефолт", и перезаписывает его на 3. В итоге получается поведение, которого явно не хотел.

🔸 Проблема 2: смешение ответственности

Функция DoSomething теперь делает больше, чем нужно: она и бизнес-логику выполняет, и значения инициализирует. Это противоречит принципу единственной ответственности и усложняет тестирование.

🔸 Проблема 3: дублирование

Если в коде много таких функций, каждая будет по-своему инициализировать Options. Это ведёт к дублированию и рассыпанной логике дефолтов.


💡 Что делать?

Вынеси дефолтные значения в отдельную функцию:


func DefaultOptions() Options {
return Options{
Timeout: 5 * time.Second,
Retries: 3,
Logger: log.Default(),
}
}


Теперь клиентский код выглядит явно:


opts := DefaultOptions()
opts.Retries = 0 // без ретраев

DoSomething(ctx, opts)


https://rednafi.com/go/dysfunctional_options_pattern/

👉 @golang_lib
2025/06/18 09:46:57
Back to Top
HTML Embed Code: