https://github.com/openbao/openbao
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - openbao/openbao: OpenBao exists to provide a software solution to manage, store, and distribute sensitive data including…
OpenBao exists to provide a software solution to manage, store, and distribute sensitive data including secrets, certificates, and keys. - openbao/openbao
❤4👍2
Оптимизируйте множественные вызовы с помощью singleflight
Допустим, у вас есть функция, которая получает данные по сети или выполняет ввод-вывод, и её выполнение занимает около 3 секунд:
Эта функция выдаёт новое значение каждые 10 секунд.
🔹 Если вызвать эту функцию 3 раза подряд, общее время ожидания составит примерно 9 секунд.
🔹 Если использовать 3 горутины, общее время ожидания может сократиться до 3 секунд, но функция всё равно будет вызвана 3 раза для получения одного и того же результата (~99%).
Здесь на помощь приходит пакет singleflight, который доступен по ссылке:
👉 golang.org/x/sync/singleflight.
Этот пакет позволяет выполнить функцию только один раз, независимо от того, сколько раз она была вызвана за эти 3 секунды, и возвращает один общий результат.
Это отлично подходит для оптимизации функций, работающих долго или потребляющих много ресурсов.
Как это работает?
1️⃣ Создаём объект
2️⃣ Передаём в метод
Метод
Параметр
Зачем нужен аргумент
Ключ (
Если поступает несколько запросов с одним и тем же ключом,
Пример работы: Go Playground
С этим подходом, если функция вызывается несколько раз одновременно, фактически выполняется только один её вызов. А результат этого единственного вызова разделяется между всеми ожидающими
👉 @juniorGolang | #tip
Допустим, у вас есть функция, которая получает данные по сети или выполняет ввод-вывод, и её выполнение занимает около 3 секунд:
Эта функция выдаёт новое значение каждые 10 секунд.
Здесь на помощь приходит пакет singleflight, который доступен по ссылке:
Этот пакет позволяет выполнить функцию только один раз, независимо от того, сколько раз она была вызвана за эти 3 секунды, и возвращает один общий результат.
Это отлично подходит для оптимизации функций, работающих долго или потребляющих много ресурсов.
Как это работает?
singleflight.Groupgroup.Do() функцию, которая выполняет дорогостоящие вычисления.Метод
group.Do() возвращает:(result any, err error, shared bool)
Параметр
shared показывает, был ли результат разделён между несколькими вызовами.Зачем нужен аргумент
key?Ключ (
key) — это идентификатор запроса.Если поступает несколько запросов с одним и тем же ключом,
singleflight понимает, что они запрашивают одно и то же.Пример работы: Go Playground
С этим подходом, если функция вызывается несколько раз одновременно, фактически выполняется только один её вызов. А результат этого единственного вызова разделяется между всеми ожидающими
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2
https://github.com/goipay/goipay
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - goipay/goipay: A lightweight crypto payment processor microservice, written in Golang, designed for creating and processing…
A lightweight crypto payment processor microservice, written in Golang, designed for creating and processing cryptocurrency invoices via gRPC. - goipay/goipay
👍6❤2
Разбор DNS: от основ до создания DNS-сервера на Go
Статья объясняет основы DNS, процесс разрешения доменных имен и создание собственного DNS-сервера на Go.
Автор рассматривает работу DNS-запросов и делится проектом DNS-сервера с веб-интерфейсом на GitHub.
Полезно для изучающих сети и Go
👉 Читать
👉 @juniorGolang | #cтатья
Статья объясняет основы DNS, процесс разрешения доменных имен и создание собственного DNS-сервера на Go.
Автор рассматривает работу DNS-запросов и делится проектом DNS-сервера с веб-интерфейсом на GitHub.
Полезно для изучающих сети и Go
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🤔1
https://github.com/Vein05/nomnom
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1😁1
Фильтрация без лишних аллокаций
При фильтрации слайсов в Go стандартный подход — создание нового слайса для отфильтрованных элементов.
Однако такой метод приводит к дополнительным аллокациям памяти.
Более эффективный способ — фильтровать «на месте», используя исходный массив слайса.
Как это работает:
•
• Добавляя
Таким образом, мы не выделяем новую память, а заполняем уже существующий массив.
Этот метод особенно полезен, когда:
•
• Критична производительность, особенно при работе с большими объемами данных.
👉 @juniorGolang | #tip
При фильтрации слайсов в Go стандартный подход — создание нового слайса для отфильтрованных элементов.
Однако такой метод приводит к дополнительным аллокациям памяти.
Более эффективный способ — фильтровать «на месте», используя исходный массив слайса.
Как это работает:
•
filtered := numbers[:0] создаёт новый слайс filtered, который ссылается на тот же массив, что и numbers, но имеет нулевую длину, сохраняя емкость numbers. • Добавляя
num в filtered, мы избегаем лишних аллокаций, так как просто изменяем содержимое numbers (или его базового массива).Таким образом, мы не выделяем новую память, а заполняем уже существующий массив.
Этот метод особенно полезен, когда:
•
numbers больше не нужен после фильтрации.• Критична производительность, особенно при работе с большими объемами данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥7❤3👎1
https://github.com/yusing/godoxy
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Leak and Seek: A Go Runtime Mystery
Статья описывает расследование команды Cyolo, связанное с утечкой памяти в приложении на языке Go. После сообщений клиентов о проблемах с производительностью команда обнаружила, что утечка связана с объектами SqliteRows, SqliteStmt и SqliteConn в драйвере SQLite3.
Они исследовали возможность циклических ссылок и проблемы с механизмом финализаторов в Go, но выяснили, что причиной была блокировка горутины финализатора из-за функции Close в пакете go-smb2, выполняющей потенциально блокирующие операции ввода-вывода.
Это приводило к задержке освобождения памяти и утечке ресурсов. В результате команда предложила улучшения для мониторинга финализаторов и сообщила о найденных проблемах сообществу Go
👉 Читать
👉 @juniorGolang | #cтатья
Статья описывает расследование команды Cyolo, связанное с утечкой памяти в приложении на языке Go. После сообщений клиентов о проблемах с производительностью команда обнаружила, что утечка связана с объектами SqliteRows, SqliteStmt и SqliteConn в драйвере SQLite3.
Они исследовали возможность циклических ссылок и проблемы с механизмом финализаторов в Go, но выяснили, что причиной была блокировка горутины финализатора из-за функции Close в пакете go-smb2, выполняющей потенциально блокирующие операции ввода-вывода.
Это приводило к задержке освобождения памяти и утечке ресурсов. В результате команда предложила улучшения для мониторинга финализаторов и сообщила о найденных проблемах сообществу Go
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2😁2
Продолжайте работу с контекстами с помощью
Мы уже знаем, что при отмене родительского контекста отменяются и все его дочерние контексты, верно?
Но иногда это поведение нежелательно.
Есть случаи, когда нужно, чтобы определённые операции продолжались, даже если родительский контекст был отменён.
Представьте, что вы обрабатываете HTTP-запрос, и при его отмене (например, из-за таймаута или разрыва соединения с клиентом) всё ещё необходимо залогировать информацию о запросе и собрать метрики.
Это возможно, но новый контекст не содержит значений из исходного контекста события, которые важны, например, для логирования или сбора метрик.
Передача значений возможна только через дочерний контекст.
Возвращаясь к примеру с HTTP-запросом, решение следующее:
Кстати, эта функция появилась в Go 1.21.✌️
👉 @juniorGolang | #tip
context.WithoutCancel()Мы уже знаем, что при отмене родительского контекста отменяются и все его дочерние контексты, верно?
Но иногда это поведение нежелательно.
Есть случаи, когда нужно, чтобы определённые операции продолжались, даже если родительский контекст был отменён.
Представьте, что вы обрабатываете HTTP-запрос, и при его отмене (например, из-за таймаута или разрыва соединения с клиентом) всё ещё необходимо залогировать информацию о запросе и собрать метрики.
«Ха, просто создам новый контекст для этих операций»
Это возможно, но новый контекст не содержит значений из исходного контекста события, которые важны, например, для логирования или сбора метрик.
Передача значений возможна только через дочерний контекст.
Возвращаясь к примеру с HTTP-запросом, решение следующее:
context.WithoutCancel позволяет создать дочерний контекст, который не будет отменён при отмене родительского. Это обеспечивает завершение нужных операций даже после отмены запроса.Кстати, эта функция появилась в Go 1.21.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3
https://github.com/gleicon/browserhttp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Избегайте использования
Когда вы работаете над проектами, где нужно генерировать ключи — например, для шифрования или создания уникальных идентификаторов — качество и безопасность этих ключей имеют большое значение.
Почему не
Пакет
Это означает, что если известен способ генерации чисел (seed), можно предсказать их значения.
Даже если использовать в качестве seed текущее время (например,
Почему
Пакет
Он спроектирован таким образом, чтобы быть непредсказуемым, используя источники случайности от операционной системы, которые гораздо сложнее предугадать.
👉 @juniorGolang | #tip
math/rand, вместо этого используйте crypto/rand для генерации ключейКогда вы работаете над проектами, где нужно генерировать ключи — например, для шифрования или создания уникальных идентификаторов — качество и безопасность этих ключей имеют большое значение.
Почему не
math/rand?Пакет
math/rand генерирует псевдослучайные числа.Это означает, что если известен способ генерации чисел (seed), можно предсказать их значения.
Даже если использовать в качестве seed текущее время (например,
time.Now().UnixNano()), уровень непредсказуемости (энтропии) остаётся низким, потому что время между запусками не сильно отличается.Почему
crypto/rand?Пакет
crypto/rand предоставляет способ генерации криптографически стойких случайных чисел.Он спроектирован таким образом, чтобы быть непредсказуемым, используя источники случайности от операционной системы, которые гораздо сложнее предугадать.
crypto/rand подходит для шифрования, аутентификации и других операций, чувствительных к безопасности.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤2
https://github.com/rotisserie/eris
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Не допускайте сбоя: паттерн повторной попытки (Retry Pattern) в Go
Статья объясняет, как реализовать паттерн повторных попыток (retry) в Go для обработки временных сбоев — например, сетевых ошибок.
Описываются разные стратегии (фиксированная задержка, экспоненциальный бэкофф с джиттером) и дается пример универсального retry-механизма.
👉 Читать
👉 @juniorGolang | #cтатья
Статья объясняет, как реализовать паттерн повторных попыток (retry) в Go для обработки временных сбоев — например, сетевых ошибок.
Описываются разные стратегии (фиксированная задержка, экспоненциальный бэкофф с джиттером) и дается пример универсального retry-механизма.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👎1
API маршрутизатор для серверов #MCP, написанный на Go
https://github.com/chatmcp/mcprouter
👉 @juniorGolang | #ресурсы
https://github.com/chatmcp/mcprouter
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Получаем указатели проще с помощью дженериков
Небольшой совет для тех, кто пишет на Go и часто сталкивается с необходимостью получить указатель на значение.
Раньше вы, возможно, делали так (1 картинка)
Или пытались уместить всё в одну строчку, используя небольшой трюк (2 картинка)
Такой способ рабочий, но выглядит громоздко, особенно если приходится делать это часто для разных типов данных.
Теперь давайте посмотрим на более простой и современный способ с дженериками (3 картинка)
Эта небольшая функция позволяет создавать указатель для любого типа значения, не повторяя один и тот же код снова и снова.
Просто передайте своё значение в функцию
Такой подход делает код чище и избавляет от лишнего дублирования.
Больше не нужно писать отдельные функции или вручную обрабатывать указатели для каждого типа. Держите код простым и сосредоточьтесь на главном.
👉 @juniorGolang | #tip
Небольшой совет для тех, кто пишет на Go и часто сталкивается с необходимостью получить указатель на значение.
Раньше вы, возможно, делали так (1 картинка)
Или пытались уместить всё в одну строчку, используя небольшой трюк (2 картинка)
Такой способ рабочий, но выглядит громоздко, особенно если приходится делать это часто для разных типов данных.
Теперь давайте посмотрим на более простой и современный способ с дженериками (3 картинка)
Эта небольшая функция позволяет создавать указатель для любого типа значения, не повторяя один и тот же код снова и снова.
Просто передайте своё значение в функцию
Ptr, и вы получите нужный указатель (4 картинка)Такой подход делает код чище и избавляет от лишнего дублирования.
Больше не нужно писать отдельные функции или вручную обрабатывать указатели для каждого типа. Держите код простым и сосредоточьтесь на главном.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍6👎4🤔2