Если вы хотите протестировать производительность своего Go-кода, вы можете написать несколько бенчмарк-тестов.
Они анализируют скорость выполнения и использование памяти различными функциями и блоками кода.
Здесь Педро показывает, как писать бенчмарк-тесты для ваших функций на Golang:
https://freecodecamp.org/news/how-to-write-benchmark-tests-for-your-golang-functions/
👉 @juniorGolang | #cтатья
Они анализируют скорость выполнения и использование памяти различными функциями и блоками кода.
Здесь Педро показывает, как писать бенчмарк-тесты для ваших функций на Golang:
https://freecodecamp.org/news/how-to-write-benchmark-tests-for-your-golang-functions/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2
Начиная с Go 1.8, стандартная библиотека
Этот метод обеспечивает "плавное" завершение работы сервера, поскольку он:
🔹 Немедленно прекращает приём новых подключений
🔹 Сохраняет существующие подключения активными до завершения всех текущих запросов
🔹 Предоставляет контекст для управления таймаутом на завершение "висящих" запросов
🔹 Завершается только после обработки всех находящихся в процессе выполнения запросов
🔹 Предотвращает утечки подключений при завершении работы приложения
Без корректного завершения, принудительное завершение работы сервера может привести к обрыву активных запросов, ошибкам на стороне клиента и потенциальной неконсистентности данных.
Метод
👉 @juniorGolang | #tip
http.Server включает метод Shutdown, который критически важен для корректного завершения работы веб-сервисов.Этот метод обеспечивает "плавное" завершение работы сервера, поскольку он:
Без корректного завершения, принудительное завершение работы сервера может привести к обрыву активных запросов, ошибкам на стороне клиента и потенциальной неконсистентности данных.
Метод
Shutdown элегантно решает эту проблему. Ниже приведена полноценная реализация, демонстрирующая обработку нескольких сигналов ОС для плавного завершения работы:Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍9
This media is not supported in your browser
VIEW IN TELEGRAM
Лёгкая очередь сообщений, реализованная на Go, с поддержкой SQLite, PostgreSQL и ORM в качестве постоянного хранилища
https://github.com/ixugo/nsqite/blob/master/README.md
👉 @juniorGolang | #ресурсы
https://github.com/ixugo/nsqite/blob/master/README.md
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
При разработке приложений, использующих LLM API, таких как OpenAI или Anthropic, вы быстро упрётесь в лимиты запросов при масштабной обработке. Пакет
🔹 Реализует лимитирование скорости на основе алгоритма token bucket с точной настройкой
🔹 Поддерживает ожидание с учётом контекста и возможностью отмены
🔹 Эффективно обрабатывает всплески нагрузки благодаря настраиваемому размеру «ведра»
🔹 Органично интегрируется с моделью конкурентности Go
Алгоритм token bucket особенно хорошо подходит для LLM‑API. Каждый запрос потребляет один токен из «бакета», который пополняется с заданной скоростью. Если «бакет» пуст, запросы ожидают появления токенов вместо того, чтобы сразу завершаться с ошибкой.
Выше приведён пример кода с неофициальным клиентом OpenAI и использованием пакета
👉 @juniorGolang | #tip
rate из https://golang.org — хорошее решение этой проблемы, так как он:Алгоритм token bucket особенно хорошо подходит для LLM‑API. Каждый запрос потребляет один токен из «бакета», который пополняется с заданной скоростью. Если «бакет» пуст, запросы ожидают появления токенов вместо того, чтобы сразу завершаться с ошибкой.
Выше приведён пример кода с неофициальным клиентом OpenAI и использованием пакета
ratePlease open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
https://github.com/sesopenko/genericpubsub
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Если вы обрабатываете HTTP-запросы на Go, сжатие gzip является важным инструментом для снижения потребления трафика и ускорения отклика. Пакет
При реализации gzip-сжатия в веб-серверах:
🔹 Всегда проверяйте заголовок
🔹 Устанавливайте корректный заголовок ответа
🔹 Избегайте сжатия уже сжатых форматов (например, изображений, видео)
🔹 Используйте
Вот пример реализации с использованием паттерна middleware.
👉 @juniorGolang | #tip
encoding/gzip упрощает реализацию, но есть некоторые подводные камни, о которых стоит помнить.При реализации gzip-сжатия в веб-серверах:
Accept-Encoding перед применением сжатияContent-Encodingsync.Pool для повторного использования gzip-писателей и повышения производительностиВот пример реализации с использованием паттерна middleware.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2
https://github.com/boozec/rahanna
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Дженерики в Go: Ваш дружелюбный гид по повторно используемому коду
В этом гайде рассказывается, что такое дженерики, как их использовать и зачем они нужны
👉 Читать
👉 @juniorGolang | #cтатья
В этом гайде рассказывается, что такое дженерики, как их использовать и зачем они нужны
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍5
https://github.com/go-simpler/sloglint
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - go-simpler/sloglint: 🪵 Ensure consistent code style when using log/slog
🪵 Ensure consistent code style when using log/slog - go-simpler/sloglint
❤9
Сигнал SIGHUP для перезагрузки конфигурации
SIGHUP — это сигнал, находящийся на стыке двух миров. Он возник из-за физического «обрыва» соединения с терминалом, и его изначальное значение — потеря управляющего терминала — актуально до сих пор.
Многие приложения, включая приложения на Go (по умолчанию), обрабатывают три сигнала для завершения работы: SIGTERM, SIGINT и SIGHUP. Среди них SIGHUP несет дополнительные нюансы и сегодня может иметь меньшее значение.
По определению:
Но что именно представляет собой «управляющий терминал»?
👉 Читать далее
👉 @juniorGolang | #cтатья
SIGHUP — это сигнал, находящийся на стыке двух миров. Он возник из-за физического «обрыва» соединения с терминалом, и его изначальное значение — потеря управляющего терминала — актуально до сих пор.
Многие приложения, включая приложения на Go (по умолчанию), обрабатывают три сигнала для завершения работы: SIGTERM, SIGINT и SIGHUP. Среди них SIGHUP несет дополнительные нюансы и сегодня может иметь меньшее значение.
По определению:
SIGHUP («signal hang up») — это сигнал, отправляемый процессу при закрытии его управляющего терминала. — Википедия
Но что именно представляет собой «управляющий терминал»?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
С помощью Go можно создавать и запускать последовательные программы, которые обмениваются данными друг с другом через каналы.
Однако поведение каналов по умолчанию — блокирующее, если нет данных для чтения:
Это полезно в сценариях, где нужно дождаться сигнала перед выполнением каких-либо действий (например, для корректного завершения работы). Но иногда требуется, чтобы часть программы одновременно слушала несколько каналов.
Если выполнение блокируется на первом канале, как оно узнает о сообщении во втором? Решением является мультиплексирование каналов, и в Go это делается с помощью ключевого слова
Ключевое слово
Вы можете явно блокировать выполнение или использовать
Предположим, у вас есть фоновый воркер, который, получив данные из очереди, должен выполнить некоторую операцию. Также вы хотите обрабатывать сигналы отмены и периодически чистить ресурсы, поскольку воркер работает в фоне.
В приведённом примере мы мультиплексируем каналы, чтобы добиться всего этого:
В первом
Внутри этого блока создаётся
Внутри
После завершения обработки (успешной или по тайм-ауту) вызывается
Далее мы пытаемся отправить результат в канал результатов, но с дополнительной защитой — мы не хотим блокироваться, если получатель не успевает обрабатывать данные.
Снова используется
Второй
Третий
Такой шаблон элегантно решает сразу несколько задач: обработку задач, учёт тайм-аутов, корректное завершение, доставку результатов и регулярное обслуживание — при этом предотвращая утечки ресурсов.
👉 @juniorGolang
Однако поведение каналов по умолчанию — блокирующее, если нет данных для чтения:
<-channel (будет ожидать, пока не появятся данные)Это полезно в сценариях, где нужно дождаться сигнала перед выполнением каких-либо действий (например, для корректного завершения работы). Но иногда требуется, чтобы часть программы одновременно слушала несколько каналов.
Если выполнение блокируется на первом канале, как оно узнает о сообщении во втором? Решением является мультиплексирование каналов, и в Go это делается с помощью ключевого слова
select.Ключевое слово
select в Go синтаксически похоже на оператор switch, но используется для мультиплексирования каналов, то есть для одновременного прослушивания нескольких каналов. Каждый case — это операция с каналом, при выполнении которой исполняется соответствующий блок кода (чтение из канала или запись в него).Вы можете явно блокировать выполнение или использовать
default-ветку, чтобы продолжить выполнение без блокировки.Предположим, у вас есть фоновый воркер, который, получив данные из очереди, должен выполнить некоторую операцию. Также вы хотите обрабатывать сигналы отмены и периодически чистить ресурсы, поскольку воркер работает в фоне.
В приведённом примере мы мультиплексируем каналы, чтобы добиться всего этого:
В первом
case мы получаем данные из очереди для дальнейшей обработки. Если канал закрыт — выходим из воркера.Внутри этого блока создаётся
context с тайм-аутом 30 секунд, который передаётся в функцию, обрабатывающую задачу с учётом тайм-аута. Это критически важно — так ни одна задача не сможет бесконечно блокировать воркер.Внутри
processWithTimeout() запускается горутина, выполняющая основную задачу, в то время как основная функция ожидает либо завершения работы, либо срабатывания тайм-аута. Для этого используется буферизированный канал для получения результата и select-оператор для обработки возможных ситуаций с тайм-аутом.После завершения обработки (успешной или по тайм-ауту) вызывается
cancel(), чтобы освободить ресурсы, связанные с контекстом. Даже если операция завершилась по тайм-ауту, явный вызов cancel() — это хорошая практика в Go для корректной очистки ресурсов.Далее мы пытаемся отправить результат в канал результатов, но с дополнительной защитой — мы не хотим блокироваться, если получатель не успевает обрабатывать данные.
Снова используется
select с default-веткой: если канал результатов переполнен, логируется предупреждение, и воркер сразу переходит к следующей задаче без ожидания. Такой неблокирующий подход предотвращает зависание воркера и позволяет ему продолжать работу даже при перегрузке получателя.Второй
case в основном select-блоке обрабатывает корректное завершение работы — при отмене родительского контекста воркер очищает ресурсы и завершает выполнение.Третий
case реализует периодическую проверку состояния (health check) каждые 5 минут бездействия. Это необходимо для выполнения обслуживающих задач, таких как очистка устаревших соединений, даже если нет новых задач.Такой шаблон элегантно решает сразу несколько задач: обработку задач, учёт тайм-аутов, корректное завершение, доставку результатов и регулярное обслуживание — при этом предотвращая утечки ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤6🔥3
Вышел Pion WebRTC v4.1.0 — стабильная поддержка полного AV1, передача больших сообщений через DataChannels и RTP-пейлоадер для H.265
https://github.com/pion/webrtc/releases/tag/v4.1.0
👉 @juniorGolang
https://github.com/pion/webrtc/releases/tag/v4.1.0
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
Release v4.1.0 · pion/webrtc
Pion v4.1.0
New release schedule – a fresh minor version will ship on the last weekend of every month.
AV1 support is complete and stable.
Data Channels now handle payloads larger than 65 535 byte...
New release schedule – a fresh minor version will ship on the last weekend of every month.
AV1 support is complete and stable.
Data Channels now handle payloads larger than 65 535 byte...
👍9❤2
Golang sync.Pool — не серебряная пуля
Когда речь заходит об оптимизации производительности в Go, sync.Pool часто выглядит как заманчивое решение. Он обещает сократить количество аллокаций памяти и снизить нагрузку на сборщик мусора за счёт повторного использования объектов. Но всегда ли это правильный выбор? Давайте углубимся в эту интересную тему.
👉 Читать
👉 @juniorGolang
Когда речь заходит об оптимизации производительности в Go, sync.Pool часто выглядит как заманчивое решение. Он обещает сократить количество аллокаций памяти и снизить нагрузку на сборщик мусора за счёт повторного использования объектов. Но всегда ли это правильный выбор? Давайте углубимся в эту интересную тему.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🌭1
https://github.com/cristalhq/aconfig
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
Отмена контекста в Go упрощает управление операциями корректным образом.
Один из часто используемых мной паттернов — это
Запускаешь задачу (например, фоновый воркер), и её можно отменить в любой момент.
Не нужно использовать сложные сигналы или вручную управлять флагами.
Запускаешь воркер, и когда программа получает сигнал завершения (Ctrl+C), контекст отменяется, и воркер корректно завершает работу.
Это один из самых надёжных способов остановки долго работающих задач по требованию.
👉 @juniorGolang
Один из часто используемых мной паттернов — это
context.WithCancel.Запускаешь задачу (например, фоновый воркер), и её можно отменить в любой момент.
Не нужно использовать сложные сигналы или вручную управлять флагами.
Запускаешь воркер, и когда программа получает сигнал завершения (Ctrl+C), контекст отменяется, и воркер корректно завершает работу.
Это один из самых надёжных способов остановки долго работающих задач по требованию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤7
Реализация лимитера скорости с использованием Golang и Redis
В первой части этой статьи мы обсудим, почему отслеживание heartbeat-сигналов IoT-устройств критично важно и почему лимитирование запросов — это не просто полезная опция, а необходимое условие стабильности системы.
Во второй части мы перейдём к практике. Я построю рабочую систему отслеживания heartbeat-сигналов на Golang с использованием Redis, рассчитанную на распределённую архитектуру. Поехали.
👉 Читать
👉 @juniorGolang
В первой части этой статьи мы обсудим, почему отслеживание heartbeat-сигналов IoT-устройств критично важно и почему лимитирование запросов — это не просто полезная опция, а необходимое условие стабильности системы.
Во второй части мы перейдём к практике. Я построю рабочую систему отслеживания heartbeat-сигналов на Golang с использованием Redis, рассчитанную на распределённую архитектуру. Поехали.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5🔥2
🔒 Безопасность: Включает исправление уязвимости в пакете
os (CVE-2025-22873).📢 Объявление: https://groups.google.com/g/golang-announce/c/UZoIkUT367A/m/5WDxKizJAQAJ
📦 Загрузка: https://go.dev/dl/#go1.24.3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍4
AI-агент для Kubernetes с поддержкой искусственного интеллекта, который запускается в вашем терминале
https://github.com/GoogleCloudPlatform/kubectl-ai
👉 @juniorGolang
https://github.com/GoogleCloudPlatform/kubectl-ai
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🌚3🌭2
После 19 лет работы Иэн Лэнс Тейлор объявил об уходе из Google.
Большую часть этого времени он был ключевым участником команды разработчиков языка программирования Go.
Подробнее о его пути читайте здесь: https://airs.com/blog/archives/670
👉 @juniorGolang
Большую часть этого времени он был ключевым участником команды разработчиков языка программирования Go.
Подробнее о его пути читайте здесь: https://airs.com/blog/archives/670
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔6❤1
Корректное завершение работы (graceful shutdown) в Go — это тонкий процесс, требующий осторожности, чтобы избежать повреждения данных и плохого пользовательского опыта.
Это единственное руководство, которое вам нужно, чтобы овладеть этим процессом:
https://victoriametrics.com/blog/go-graceful-shutdown/
👉 @juniorGolang
Это единственное руководство, которое вам нужно, чтобы овладеть этим процессом:
https://victoriametrics.com/blog/go-graceful-shutdown/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Автор книги «100 ошибок Go и как их избежать» признался, что даже не знал о возможности доступа к переменной
👍 — если знал об этом
🔥 — если стало открытием
👉 @juniorGolang
v в условии else-if:👍 — если знал об этом
🔥 — если стало открытием
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥72👍37😁13