Golang Portal
7.93K subscribers
411 photos
26 videos
7 files
443 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Golang-разработчика

Связь: @devmangx
Download Telegram
Сигнал SIGHUP для перезагрузки конфигурации

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

Многие приложения, включая приложения на Go (по умолчанию), обрабатывают три сигнала для завершения работы: SIGTERM, SIGINT и SIGHUP. Среди них SIGHUP несет дополнительные нюансы и сегодня может иметь меньшее значение.

По определению:
SIGHUP («signal hang up») — это сигнал, отправляемый процессу при закрытии его управляющего терминала. — Википедия


Но что именно представляет собой «управляющий терминал»?

👉 Читать далее

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64
С помощью Go можно создавать и запускать последовательные программы, которые обмениваются данными друг с другом через каналы.

Однако поведение каналов по умолчанию — блокирующее, если нет данных для чтения:
<-channel (будет ожидать, пока не появятся данные)

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

Если выполнение блокируется на первом канале, как оно узнает о сообщении во втором? Решением является мультиплексирование каналов, и в Go это делается с помощью ключевого слова select.

Ключевое слово select в Go синтаксически похоже на оператор switch, но используется для мультиплексирования каналов, то есть для одновременного прослушивания нескольких каналов. Каждый case — это операция с каналом, при выполнении которой исполняется соответствующий блок кода (чтение из канала или запись в него).

Вы можете явно блокировать выполнение или использовать default-ветку, чтобы продолжить выполнение без блокировки.

Предположим, у вас есть фоновый воркер, который, получив данные из очереди, должен выполнить некоторую операцию. Также вы хотите обрабатывать сигналы отмены и периодически чистить ресурсы, поскольку воркер работает в фоне.

В приведённом примере мы мультиплексируем каналы, чтобы добиться всего этого:

В первом case мы получаем данные из очереди для дальнейшей обработки. Если канал закрыт — выходим из воркера.

Внутри этого блока создаётся context с тайм-аутом 30 секунд, который передаётся в функцию, обрабатывающую задачу с учётом тайм-аута. Это критически важно — так ни одна задача не сможет бесконечно блокировать воркер.

Внутри processWithTimeout() запускается горутина, выполняющая основную задачу, в то время как основная функция ожидает либо завершения работы, либо срабатывания тайм-аута. Для этого используется буферизированный канал для получения результата и select-оператор для обработки возможных ситуаций с тайм-аутом.

После завершения обработки (успешной или по тайм-ауту) вызывается cancel(), чтобы освободить ресурсы, связанные с контекстом. Даже если операция завершилась по тайм-ауту, явный вызов cancel() — это хорошая практика в Go для корректной очистки ресурсов.

Далее мы пытаемся отправить результат в канал результатов, но с дополнительной защитой — мы не хотим блокироваться, если получатель не успевает обрабатывать данные.

Снова используется select с default-веткой: если канал результатов переполнен, логируется предупреждение, и воркер сразу переходит к следующей задаче без ожидания. Такой неблокирующий подход предотвращает зависание воркера и позволяет ему продолжать работу даже при перегрузке получателя.

Второй case в основном select-блоке обрабатывает корректное завершение работы — при отмене родительского контекста воркер очищает ресурсы и завершает выполнение.

Третий case реализует периодическую проверку состояния (health check) каждые 5 минут бездействия. Это необходимо для выполнения обслуживающих задач, таких как очистка устаревших соединений, даже если нет новых задач.

Такой шаблон элегантно решает сразу несколько задач: обработку задач, учёт тайм-аутов, корректное завершение, доставку результатов и регулярное обслуживание — при этом предотвращая утечки ресурсов.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍96🔥3
Вышел Pion WebRTC v4.1.0 — стабильная поддержка полного AV1, передача больших сообщений через DataChannels и RTP-пейлоадер для H.265

https://github.com/pion/webrtc/releases/tag/v4.1.0

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
Golang sync.Pool — не серебряная пуля

Когда речь заходит об оптимизации производительности в Go, sync.Pool часто выглядит как заманчивое решение. Он обещает сократить количество аллокаций памяти и снизить нагрузку на сборщик мусора за счёт повторного использования объектов. Но всегда ли это правильный выбор? Давайте углубимся в эту интересную тему.

👉 Читать

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🌭1
⚙️ Простой, полезный и придерживающийся единого подхода загрузчик конфигурации для Go

https://github.com/cristalhq/aconfig

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Отмена контекста в Go упрощает управление операциями корректным образом.
Один из часто используемых мной паттернов — это context.WithCancel.

Запускаешь задачу (например, фоновый воркер), и её можно отменить в любой момент.
Не нужно использовать сложные сигналы или вручную управлять флагами.

Запускаешь воркер, и когда программа получает сигнал завершения (Ctrl+C), контекст отменяется, и воркер корректно завершает работу.

Это один из самых надёжных способов остановки долго работающих задач по требованию.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍107
Реализация лимитера скорости с использованием Golang и Redis

В первой части этой статьи мы обсудим, почему отслеживание heartbeat-сигналов IoT-устройств критично важно и почему лимитирование запросов — это не просто полезная опция, а необходимое условие стабильности системы.

Во второй части мы перейдём к практике. Я построю рабочую систему отслеживания heartbeat-сигналов на Golang с использованием Redis, рассчитанную на распределённую архитектуру. Поехали.

👉 Читать

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105🔥2
🧑‍💻 Вышли Go 1.24.3 и 1.23.9

🔒 Безопасность: Включает исправление уязвимости в пакете os (CVE-2025-22873).

📢 Объявление: https://groups.google.com/g/golang-announce/c/UZoIkUT367A/m/5WDxKizJAQAJ

📦 Загрузка: https://go.dev/dl/#go1.24.3

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4
AI-агент для Kubernetes с поддержкой искусственного интеллекта, который запускается в вашем терминале

https://github.com/GoogleCloudPlatform/kubectl-ai

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🌚3🌭2
После 19 лет работы Иэн Лэнс Тейлор объявил об уходе из Google.

Большую часть этого времени он был ключевым участником команды разработчиков языка программирования Go.

Подробнее о его пути читайте здесь: https://airs.com/blog/archives/670

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔61
Корректное завершение работы (graceful shutdown) в Go — это тонкий процесс, требующий осторожности, чтобы избежать повреждения данных и плохого пользовательского опыта.

Это единственное руководство, которое вам нужно, чтобы овладеть этим процессом:

https://victoriametrics.com/blog/go-graceful-shutdown/

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Автор книги «100 ошибок Go и как их избежать» признался, что даже не знал о возможности доступа к переменной v в условии else-if:

👍 — если знал об этом
🔥 — если стало открытием

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥72👍37😁13
Без использования CGo, кроссплатформенный GUI-инструментарий для Go

https://gitlab.com/cznic/tk9.0

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥155👍4🤔1
Директивы Go — это специальные комментарии, которые влияют на компилятор Go, компоновку (linking) и другие инструменты. Они позволяют добавлять метаданные или инструкции прямо в исходный код на Go.

Одна из особенно полезных директив — //go:embed. Она позволяет встраивать статические ресурсы, такие как файлы или целые папки, непосредственно в скомпилированный бинарный файл Go, избавляя от необходимости отдельно развёртывать папки с ресурсами.

Обычный сценарий использования — встраивание ресурсов веб-приложения (папка assets, содержащая HTML, CSS, JavaScript). Эти ресурсы затем можно обслуживать напрямую с помощью стандартного пакета Go net/http.

На картинке приведён простой пример, как встроить папку web/dist, содержащую скомпилированные ресурсы SPA, и обслуживать их

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍207🔥2
Быстрый парсер и валидатор JSON для Go

https://github.com/wundergraph/astjson

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥1
Важные аспекты при использовании пакета time в Go

При работе со значениями времени в Go одной из самых распространённых операций является сравнение двух временных меток.

Однако эта на первый взгляд простая задача может привести к скрытым ошибкам, если не учитывать разницу между использованием оператора сравнения == и методом Equal()

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83
Централизованная обработка HTTP-ошибок в Go

Статья от Алексиса Буше предлагает простой и эффективный способ централизовать обработку ошибок в HTTP-хендлерах на Go, чтобы избежать повторяющегося кода и улучшить читаемость.

Основная идея проста: изменить обработчики так, чтобы они возвращали ошибки, а не обрабатывали их напрямую.

Полный текст статьи с примерами кода доступен на сайте автора:
https://www.alexisbouchez.com/blog/http-error-handling-in-go

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124
Мощный уровень автоматизации, построенный поверх FFmpeg — разработан для того, чтобы сделать перекодирование видео и аудио проще, умнее и удобнее для интеграции.

https://github.com/welovemedia/ffmate

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🤔1
Самая недооценённая суперспособность Go — это его парсерные пакеты: go/parser, go/token и go/ast.

На самом деле поразительно, насколько редко эти пакеты используются и обсуждаются.

По сути, ваш Go-код токенизируется и парсится компилятором для построения так называемого абстрактного синтаксического дерева (AST), чтобы затем скомпилироваться в промежуточное представление (IR), которое в дальнейшем переводится в машинный код.

Пакет go/parser разбирает Go-код и позволяет корректно определить всё, что касается Go-файла: импорты, комментарии, функции, типы, переменные и многое другое.

Прелесть в том, что это открывает потрясающие возможности для автоматизации шаблонного кода, ведь у вас буквально под рукой встроенный парсер языка!

Например, вы можете генерировать структуры DTO из моделей с JSON-тегами. Если бы вы попытались сделать это вручную, используя только условные операторы и циклы, ваш код был бы полон ошибок, а надёжная реализация потребовала бы создания полноценного парсера Go-кода. К счастью, в Go вы можете использовать стандартную библиотеку для разбора Go-файлов, извлечения всех типов и генерации DTO.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥43🤯1
Обрабатывайте 8 байт за раз, используя старую технику под названием Simd Within a Register (SWAR), на Go

https://github.com/dans-stuff/swar

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍3🔥2🏆1
Презентация «Что нового в Go» с конференции Google I/O 2025

https://youtu.be/kj80m-umOxs?si=dUG1XvFWuU5wNscN

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94