Category : golang

golang
Ускоряем валидацию UTF-8 в 10 раз (>10 ГБ/с): реализация алгоритма Lemire-Keiser на Go с ARM NEON

UTF-8 валидация — одна из базовых операций при работе с текстом, которая выполняется миллионы раз в секунду в современных приложениях. Стандартная реализация в Go, хоть и корректная, далека от оптимальной по производительности. В этой статье расскажу, как мне удалось ускорить валидацию UTF-8 в 10 раз, используя SIMD‑инструкции ARM NEON и алгоритм из статьи «Validating UTF-8 In Less Than One Instruction Per Byte» Джона Кейзера и Дэниела Лемира.Проблема стандартной валидацииСтандартная реализация…

  • вторник, 1 июля 2025 г. в 00:00:09
golang
Разбираемся в сборщике мусора Go: просто и с гофером

Я решил написать эту статью в первую очередь для себя, потому что перечитал кучу материалов про сборщик мусора (GC) в Go, и почти все они были слишком сложными. Моя цель — объяснить, как работает GC, что такое инкрементальность и барьер записи, так, чтобы я сам понял и запомнил и, возможно, стал полезным для других. А чтобы было веселее, я добавил гофера — маскота Go — в забавных иллюстрациях, которые помогут визуализировать идеи. Если вы, как и я, хотите разобраться в GC без лишней головной бо…

  • вторник, 1 июля 2025 г. в 00:00:08
golang
Эволюция JSON в Go: от v1 к v2

Вторая версия пакета json/v2, которая появится в Go 1.25 (август 2025) — большое обновление с множеством несовместимых изменений. В v2 добавили новые возможности, исправили ошибки в API и поведении, а также улучшили производительность. Давайте посмотрим, что изменилось!Базовоый сценарий использования функций Marshal и Unmarshal не меняется. Этот код работает как в v1, так и в v2:type Person struct { Name string Age int } alice := Person{Name: "Alice", Age: 25} // Кодируем Алис…

  • вторник, 1 июля 2025 г. в 00:00:07
golang
Жонглирование памятью: арены в Golang

Приветствую, в высоконагруженной среде аллокации большого размера достаточно сильно влияют на скорость обработки той или иной части сервиса, для того чтобы более тонко контролировать память, появились арены. Как же они включаются? Тут всё просто, нужен флаг GOEXPERIMENT=arenas. Разберем на примере работу памяти с "маленькими объектами".Маршрут "маленького объекта"За "маленькие объекты" (крошечные) в Golang отвечает так называемый "tiny allocator". Как же он работ…

  • понедельник, 30 июня 2025 г. в 00:00:09
golang
Большой разбор Слайсов, Типы и структуры данных Go

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

  • воскресенье, 29 июня 2025 г. в 00:00:08
golang
Каскадная отмена контекстов в Go: от исходного кода до производственных паттернов

В прошлой статье, я познакомил с работой контекста, его внутренними методами, примерами. В этот же раз хотелось бы глубже погрузиться в работу внутреннего взаимодействия контекста с призмы его отмены, поэтому эта статья является продолжением прошлой.Отмена как явноеfunc main() { ctx, cancel := context.WithCancel(context.Background()) go func() { if err := worker(ctx); err != nil { log.Printf("воркер выполнился: %v", err) } }() time.Sleep(time.Second) cancel() time.Sle…

  • пятница, 27 июня 2025 г. в 00:00:06
golang
Практический гайд по авторизации и аутентификации в микросервисах с Ory и Apache APISIX

Мне кажется, что уже есть сотни разных статей на эту тему, но каждый раз мне чего-то не хватало. Поэтому я решил написать свою статью, в которой покажу, как я реализую авторизацию и аутентификацию в своих проектах. Это именно гайд: вы можете взять готовый код и адаптировать его под свои нужды. В рамках статьи будут использоваться Ory Hydra и Ory Kratos, Apache APISIX в качестве API Gateway и несколько микросервисов на Golang. Всё это будет работать в Docker, чтобы вы могли легко запустить и п…

  • пятница, 27 июня 2025 г. в 00:00:05
golang
Условная буферизация логов в Go

В .NET 9 появилась интересная функциональность — Log Buffering, которая позволяет буферизовать логи в памяти и выводить их только при определенных условиях. Меня заинтересовала эта идея, что я решил реализовать аналогичный механизм для Go. Так появился EmitLog — пакет для условной буферизации логов.Проблема традиционного логированияПредставьте типичный веб-сервис с детальным логированием:func ProcessPayment(ctx context.Context, paymentID string) error { log.Debug("Starting payment proc…

  • пятница, 27 июня 2025 г. в 00:00:04
golang
Rattle: узнаём об ошибках в Docker раньше, чем сообщит клиент

Rattle — лёгкий инструмент для мониторинга логов Docker, который помогает оперативно получать важные ошибки в Telegram до того, как о них напомнит клиент. Всё запускается через Docker Compose — без дополнительной инфраструктуры и сложной интеграции.Rattle — Telegram уведомления из Docker💡 Зачем нужен RattleИнструмент создан для разработчиков небольших проектов — когда нужно быстро получать важные ошибки и сообщения из Docker-контейнеров без развёртывания сложной инфраструктуры.Всё, что требует…

  • четверг, 26 июня 2025 г. в 00:00:04