38K subscribers
1.53K photos
38 videos
5 files
1.69K links
admin - @haarrp

https://t.me/Golang_google - Golang разработка

https://t.me/golangl - golang чат

https://t.me/golangtests go тесты

https://t.me/ai_machinelearning_big_data машинное обучение

@itchannels_telegram

РКН: clck.ru/3Fmx3s
Download Telegram
🧪 Go synctest — решение для нестабильных (flaky) тестов

Flaky-тесты в многопоточном Go-коде — боль. Новый экспериментальный инструмент synctest из Go 1.24 решает эту проблему с помощью синтетического времени и контроля исполнения goroutine.

📌 Что это такое:
synctest — специальный режим, запускающий тесты в изолированной "песочнице", где:
time.Sleep не ждёт реального времени
• все goroutine исполняются детерминированно
• нет зависимости от планировщика и нагрузки ОС

🔧 Пример:


import "testing/synctest"

func TestSharedValue(t *testing.T) {
synctest.Run(func() {
var shared atomic.Int64
go func() {
shared.Store(1)
time.Sleep(1 * time.Microsecond)
shared.Store(2)
}()
time.Sleep(5 * time.Microsecond)
if shared.Load() != 2 {
t.Errorf("shared = %d, want 2", shared.Load())
}
})
}


Даже с Sleep, результат всегда стабилен. Без synctest такой тест может иногда проваливаться.

⚙️ Преимущества:
Устранение race-условий при тестировании
Нет задержек — Sleep срабатывает мгновенно
Можно тестировать поведение с точностью до микросекунды
Подходит для любых atomic, mutex, select, time.After и др.

🚫 Ограничения:
• Пока экспериментально: нужно запускать с GOEXPERIMENT=synctest
• Не подходит для ввода-вывода, работы с сетью или временем вне "bubble"

📖 Подробнее:
https://victoriametrics.com/blog/go-synctest/

@golang_google
📦 Как оптимизировать struct в Go: выравнивание, паддинг и порядок полей

Когда ты работаешь с Go и структурой данных (`struct`), порядок полей — это не просто эстетика. Это напрямую влияет на:
• размер занимаемой памяти
• эффективность использования кэша
• и в итоге — на производительность твоей программы.

Автор [buarki на DEV.to](https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1) показывает, как правильно выстраивать поля в структурах, чтобы избежать лишнего паддинга и сделать struct более компактным и быстрым.

🔍 Что такое padding?

Go автоматически выравнивает поля структур по их размеру. Например:

type Bad struct {
a bool // 1 байт
b int64 // 8 байт
c bool // 1 байт
}

Кажется, что struct должен занимать 10 байт. Но из-за выравнивания Go вставит паддинг, и итоговый размер окажется 24 байта.

Как это исправить?

Меняем порядок полей:

type Good struct {
b int64 // 8 байт
a bool // 1 байт
c bool // 1 байт
}

Теперь структура занимает 16 байт, а не 24 — и всё благодаря грамотному размещению полей.

📌 Рекомендации:

• Сортируй поля от самых крупных к самым мелким
• Группируй однотипные поля
• Избегай перемешивания bool`/`byte с int64`/`float64
• Используй визуализацию (например, viztruct) для анализа struct'ов
• Проверяй размер struct через unsafe.Sizeof()

🎯 Это особенно важно при:
• массовом использовании struct в массивах и слайсах
• передаче struct между потоками
• работе с бинарными протоколами или mmap

📖 Подробнее с примерами: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
👣 Как предотвратить "молчаливую смерть" горутин в Go?

В статье рассматривается, как реализовать механизм "сердцебиения" (heartbeat) для горутин в Go, чтобы отслеживать их активность и своевременно обнаруживать сбои.

🔍 Зачем нужны heartbeats?
Иногда горутина может завершиться неожиданно без явных ошибок или логов, что затрудняет диагностику. Механизм heartbeats позволяет периодически отправлять сигналы о том, что горутина все еще работает, даже если она ожидает задания. Это особенно полезно для:

Мониторинга состояния фоновых задач

Обнаружения и перезапуска "зависших" горутин

Улучшения надежности и отказоустойчивости систем

🛠 Как это реализовать?
Используя time.Ticker, можно настроить горутину на периодическую отправку сигналов активности через канал. Пример функции dowork:


func dowork(done <-chan interface{}, pulseInterval time.Duration) (<-chan interface{}, <-chan struct{}) {
heartbeater := make(chan interface{})
result := make(chan struct{})
go func() {
defer close(result)
defer close(heartbeater)

pulse := time.NewTicker(pulseInterval)
workGen := time.NewTicker(3 * pulseInterval)

defer pulse.Stop()
defer workGen.Stop()

sendPulse := func() {
select {
case heartbeater <- struct{}{}:
default:
// если никто не слушает, пропускаем
}
}

sendResult := func(res struct{}) {
for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case result <- res:
return
}
}
}

for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case <-workGen.C:
sendResult(struct{}{})
}
}
}()
return heartbeater, result
}


🧪 А в main можно следить за этим:


for {
select {
case <-heartbeat:
log.Println("Still alive")
case <-time.After(5 * time.Second):
log.Println("Timeout! Goroutine might be dead")
}
}
}()


🎯 Зачем это нужно:
• Обнаружение зависших/умерших горутин
• Реализация watchdog'ов
• Надежность фоновых процессов в проде

🔗 Статья: https://blog.devgenius.io/how-to-build-heartbeats-in-go-let-your-goroutines-say-still-breathing-d047253d5c78

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🗃️ Stoolap — лёгкая и быстрая SQL-база данных на чистом Go без зависимостей

Stoolap — это современный HTAP-движок (Hybrid Transactional/Analytical Processing), сочетающий OLTP и OLAP в одном ядре. Подходит как для транзакционных задач, так и для аналитики.

🚀 Возможности:
• Полностью написан на Go — никаких внешних зависимостей
• ACID-транзакции через MVCC
• Колонковое хранение с SIMD-ускорением
• Поддержка SQL: JOIN, агрегаты, оконные функции
• Встроенный тип JSON
• Поддержка database/sql и интеграция с GORM
• CLI-режим и in-memory база

📦 Установка:

go get github.com/stoolap/stoolap


🔥 Быстрый старт (CLI):

stoolap -db memory://


📎 Репозиторий: https://github.com/stoolap/stoolap
🌐 Сайт: https://stoolap.io


@golang_google
🏗️ Как строить масштабируемые multi-tenant приложения на Go — опыт Atlas Cloud

В этой статье команда Atlas делится практическими стратегиями масштабирования multi-tenant приложений на Go, основанными на опыте разработки бэкенда для Atlas Cloud — части их коммерческого продукта.

🔍 Что такое multi-tenancy?

Multi-tenancy — это архитектура, при которой один инстанс системы обслуживает сразу нескольких клиентов (арендаторов).

📦 Но тут важен нюанс: клиенты ожидают, что сервис будет работать так, как будто он только для них — без потерь в скорости, надёжности и безопасности.

Именно поэтому вы *молча* обещаете каждому клиенту две вещи:

1. Изоляция данных — никакой арендатор не должен иметь доступ к чужим данным
2. Стабильная производительность — нагрузка одного арендатора не должна замедлять других

🛡️ Стратегия №1 — Физическая изоляция (Dedicated Instances)

Самый прямой способ выполнить эти обещания — запуск отдельного инстанса приложения на каждого арендатора.

Что это даёт:

Данные арендаторов хранятся в отдельных БД (или даже в разных VPC/облаках)
Полная изоляция ресурсов — никто не шумит и не мешает
Безопасность на уровне инфраструктуры

💸 Но у такого подхода есть и минусы:

Сложность в управлении: сотни и тысячи развёрнутых инстансов, каждая со своей БД и конфигурацией
Стоимость: каждый инстанс потребляет ресурсы, и это дорого
Проблемы масштабирования: каждый новый клиент = новый деплой
Сложности с наблюдаемостью: логи, метрики и дебаг — теперь распределены по куче окружений

В статье авторы разбирают гибридные подходы, модели хранения, обработку миграций и советы по коду.

🔗 Продолжение читай тут:
https://atlasgo.io/blog/2025/05/26/gophercon-scalable-multi-tenant-apps-in-go

@golang_google
📦 godump — удобный Go-инструмент для дампа объектов в читаемом виде

godump — это мощная альтернатива fmt.Printf("%#v") и spew.Dump для Go-разработчиков.

Инструмент помогает красиво и наглядно выводить внутреннее содержимое структур, карт, срезов и других объектов.

🛠️ Что умеет godump:
• Красиво форматирует вложенные структуры и срезы
• Поддерживает карты, интерфейсы, указатели, циклы
• Вывод в цвете (ANSI) и с отступами
• Умеет обходить циклические ссылки
• Простой API: godump.Dump(anyObject)

💡 Отлично подходит для:
- Отладки и логирования сложных структур
- Инспекции JSON-данных после анмаршалинга
- Быстрой визуальной проверки содержимого без IDE

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

import "github.com/goforj/godump"

type User struct {
Name string
Tags []string
}

func main() {
user := User{"Alice", []string{"dev", "golang"}}
godump.Dump(user)
}


🚀 Установка:

go get github.com/goforj/godump


🔗 https://github.com/goforj/godump

Если fmt.Println уже не справляется — попробуй godump. Красиво. Быстро. Глубоко.

@golang_google
👣 Tyk Gateway

Это современный, сверхпроизводительный, специально разработанный API-шлюз с открытым исходным кодом.

Tyk Operator предоставляет возможности полного жизненного цикла управления API в Kubernetes. Вы можете настраивать Ingress, API, политики безопасности, аутентификацию, авторизацию, посредничество, используя лучшие практики GitOps с помощью пользовательских ресурсов и примитивов, присущих Kubernetes.

📌 Github

#golang #devops #девопс

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🏠 MCP для умного дома

Тысячи бессонных ночей сотен ресёрчеров и ML-инженеров дали миру сначала большие языковые модели, а потом MCP-протокол - открытый стандарт, который связал эти модели и дал возможность подключаться к приложениям, системам и API.

Они мечтали о будущем, где ИИ будет решать климатические кризисы, расшифровывать геном, найдет решение глобальных проблем или, в крайнем случае, будет писать вам стихи и поэмы.

Как это используют люди? Пилят действительно важные и нужные интеграции.

Проект поддерживает Ollama, подключение к экосистеме управления умным домом HomeAssistant MCP и написан на Go.


🖥 Github

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Uzi — параллельный запуск AI-кодинг-агентов из терминала

Проект, который превращает терминал в многопоточную машину для работы с LLM-агентами: Claude, GPT, Aider, Codex и другими.

🧠 Что делает Uzi:
• Запускает несколько агентов параллельно
• Каждому агенту — свой git worktree, tmux и порт
• Можно задавать общую задачу, а агенты предложат решения независимо
• Позволяет наблюдать за прогрессом, подтверждать или отклонять шаги
• Упрощает слияние финальных изменений — без ручной рутины

🛠 Пример:

uzi prompt --agents claude:2,gpt4:1 "Добавь в проект GraphQL API и авторизацию"


Затем:
- uzi auto — агентам можно доверить автоматические действия
- uzi broadcast "Обнови документацию" — отправить команду всем
- uzi checkpoint — сохранить и закоммитить результат

🧪 Идеально подходит для:
— Быстрой генерации MVP
— Прототипирования фичей сразу в нескольких вариантах
— Параллельной работы с кодовыми ассистентами
— Демонстраций, где хочется "показать мощь LLM сразу в действии"

📦 Установка:

go install github.com/devflowinc/uzi@latest


📌 Репозиторий

#AI #DevTools #CLI #LLM #CodeGeneration #OpenSource

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Представлен язык программирования Gauntlet, расширяющий возможности Go

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

Развиваемый проектом инструментарий написан на языке F# и распространяется пол лицензией GPLv3. Для работы с кодом предоставляется дополнение к редактору VSCode.

Решаемые в Gauntlet проблемы:

• Назойливый вывод ошибок, связанных с неиспользуемыми переменными (Gauntlet добавляет для всех неиспользуемых переменных заглушки вида "_ = a").
• Раздутый код для обработки ошибок. В Gauntlet вместо условных блоков вида "if err != nil" используются однострочные выражения "try-with".
• Назойливый способ импорта и экспорта (например, в Go необходимо, чтобы экспортируемые имена начинались на заглавную букву).
• Отсутствие тенарного оператора. В Gauntlet можно использовать выражения вида 'let properWord = @String len(lines) > 1 ? "lines" : "line"'.
•Отсутствие синтаксиса switch-case.
• Усложнённые циклы "for". В Gauntlet можно писать "for let _, c in "Hello" {" вместо "for _, c := range "Hello" {".
• Необычный оператор присваивания (":=" для одновременного объявления и инициализации переменных; "=" для изменения значения уже объявленных переменных).
• Невозможность вызова функций по цепочке (в Gauntlet поддерживается вызов вида 'let trimmedLines = fileContentStrVersion => strings.trimSpace(_) => strings.split(_, "\n")'.

Расширенные возможности Gauntlet:

• Синтаксис "when-is" похожий на switch.case, но манипулирующий выражениями.
• Поддержка pipe-каналов, позволяющих по цепочке пропускать значение через несколько выражений или функций. например "10 => add(_, 10) => add(_, 30) => divide(_, 2)".
• Выражения "try .. with" и "force .. with".
• Выражение "wrapper" для создания псевдонимов типов (например. "wrapper Int Dollars").


✔️ Github
✔️ Gauntlet
✔️ Новость

#Gauntlet #golang

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
📡 apimocker — простой мокер REST API без бэкенда

apimocker — это легкий TUI-инструмент на Go, который поднимает фейковый API из YAML/JSON за секунды. Идеален для фронтенда, тестов и прототипов.

🛠 Что умеет:
• Динамичные JSON-ответы с шаблонами ("id": "uuid", "email": "email")
• Задержки, ошибки с вероятностью
• Отдача файлов (изображений и др.)
• Логирование (plain/json)
• TUI-интерфейс с активными маршрутами

💡 Подходит для:
• Быстрого мокинга
• Демонстраций и тестов
• Изоляции от реального API

🚀 Установка:

yay -S apimocker # Arch
# или:
git clone https://github.com/Hanashiko/apimocker.git
cd apimocker && go build -o apimocker main.go
sudo mv apimocker /usr/bin/

🔗 https://github.com/Hanashiko/apimocker

Нужен API-сервер без сервера? Используй apimocker.

@golang_google
📞 Diago — библиотека для создания VoIP-приложений на Go

Diago (сокращение от Dialog + Go) — это open-source библиотека для разработки VoIP-решений на языке Go.

VoIP (Voice over IP) — это технология, которая позволяет передавать голосовые вызовы через интернет или любую другую IP-сеть, вместо использования традиционной телефонной связи.

Она построена поверх оптимизированной библиотеки SIPgo и предназначена для быстрого и удобного создания тестируемых VoIP-приложений.

🔧 Основные возможности:

- SIP-сессии: Поддержка клиентских и серверных SIP-сессий, включая регистрацию и аутентификацию.
- Обработка медиа: Воспроизведение и запись аудио, поддержка DTMF, управление RTP/RTCP.
- Поддержка кодеков: Включая Opus, что делает библиотеку совместимой с современными стандартами аудио.
- Примеры использования: В репозитории представлены примеры, такие как эхо-тест и регистрация SIP-агента.

🚀 Быстрый старт:

Пример:


ua, _ := sipgo.NewUA()
dg := diago.NewDiago(ua)

dg.Serve(ctx, func(inDialog *diago.DialogServerSession) {
inDialog.Trying()
inDialog.Answer()

playfile, err := os.Open("demo-echotest.wav")
if err != nil {
fmt.Println("Failed to open file", err)
return
}
defer playfile.Close()

pb, _ := inDialog.PlaybackCreate()
if err := pb.Play(playfile, "audio/wav"); err != nil {
fmt.Println("Playing failed", err)
}
})


🧪 Дополнительные инструменты:
Gophone: CLI SIP-телефон, построенный на Diago, для тестирования и отладки VoIP-сервисов.

📚 Подробнее:
Репозиторий: github.com/emiago/diago
Redis и Valkey изучите секреты самых популярных open source key-value СУБД

В высоко-нагруженных сервисах Redis — не просто кэш, а важная подсистема, на которой строится значимая часть бизнес-логики. От его стабильности, масштабируемости и отказоустойчивости зависит производительность всего сервиса. Valkey - это современный производительный форк Redis с открытым исходным кодом, поддерживаемый сообществом и рядом крупных компаний. Valkey набирает популярность, поддержан крупными облачными провайдерами, и вполне возможно потеснит или вовсе заменит Redis со временем. Наш курс — для тех, кто хочет держать свой стэк и знания актуальными и глубоко разбираться, как устроен Redis и Valkey.

🌐 В программе курса:

🤩 Как эффективно использовать базовые и продвинутые структуры данных: HyperLogLog, Bitmaps и Bisields, Streams, Geospatial-индексы, Bloom Filters
🤩 Как проектировать in-memory системы, которые не разваливаются под нагрузкой, что влияет на отказоустойчивость и как её добиться
🤩 Как работает репликация и кластеризация на практике (режимы Sentinel и Cluster)
🤩 Как встроить Redis/Valkey в реальный прод с учётом безопасности, интеграций и современных практик мониторинга.

🥸 Кто мы: R&D-центр Devhands. Автор курса — Константин Ратвин — преподаватель МФТИ на кафедре БИТ (совместно со СберТех), эксперт по распределённым системам и банковским ИТ, автор курсов по СУБД и инфраструктуре, спикер HighLoad++ и PGConf.

🗓 Старт курса: 9 июня, 6 недель обучения.
Изучить программу и записаться можно здесь.

Ждем вас!

Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqxNnFKA
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Monstera — фреймворк для Go, который избавит тебя от забот о масштабировании

Пишешь приложение на Go, где нужно хранить состояние (state)?
Обычно это боль: базы, кеши, отказоустойчивость, репликация...

Monstera всё упрощает:

Пиши обычный Go-код со всеми данными в памяти или на диске
Не думай про кластеры, скейлинг, доступность — всё уже встроено
Подходит для real-time приложений, распределённых систем и сервисов с постоянным состоянием

💡 Просто подключаешь Monstera — и сразу получаешь стабильную, масштабируемую систему.

go get -u github.com/evrblk/monstera@latest

🔗 Попробовать

#golang
🎆 Релиз Go 1.24.4 и 1.23.10!

🔐 Безопасность:
Обновления включают исправления для критических уязвимостей:
• CVE-2025-4673 (в `net/http`)
• CVE-2025-0913 (в `os`)
• CVE-2025-22874 (в `crypto/x509`)

📢 Анонс: https://groups.google.com/g/golang-announce/c/ufZ8WpEsA3A/m/XDxq7uidAgAJ

📦 Скачать: https://go.dev/dl/#go1.24.4

#golang #security #update

@Golang_google
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ GOscade - минималистичная библиотека для автоматического запуска, остановки и координации зависимостей в Go

Когда в проекте десятки компонентов, требующих запуска, важно соблюдать правильный порядок, проверять готовность и корректно останавливать при критических ошибках или SIGTERM.

goscade делает это за вас:

Автоматически определяет зависимости между компонентами
Запускает их по топологическому порядку, параллельно
Следит за readiness, обрабатывает ошибки и каскадное завершение
Делает graceful shutdown в обратном порядке

Всё, что нужно - реализовать интерфейс и зарегистрировать компонент:

type Component interface {
Run(ctx context.Context, readinessProbe func(error)) error
}


📦 Репозиторий: https://github.com/ognick/goscade
📦 Outbox — простая реализация outbox-паттерна на Go для микросервисов

Если твои сервисы пишут в базу и одновременно публикуют события в Kafka, RabbitMQ или другие брокеры — знай: без outbox-паттерна ты рискуешь потерять данные.

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

🧠 Что она делает:

1. Сохраняет событие в таблицу outbox в рамках транзакции
2. Отдельный воркер читает сообщения и отправляет их в брокер
3. После успешной доставки — сообщение помечается как доставленное

💡 Особенности:

- Поддержка PostgreSQL
- Готовые адаптеры для Kafka и RabbitMQ
- Возможность использовать свой брокер (реализуй интерфейс)
- Поддержка сериализации / форматирования событий
- Использует sqlx и стандартную database/sql

🧩 Подходит для:

- надёжной синхронизации БД событий
- микросервисов, где важна консистентность
- систем, где нужна повторная доставка без дублей

🔥 Отличный выбор, если ты хочешь atomic-публикацию событий без тяжёлых фреймворков и сервисов.

#Go #OutboxPattern #Kafka #RabbitMQ #Microservices #EventDriven #PostgreSQL

🔗 https://github.com/oagudo/outbox
🚀 Automi — потоковая обработка данных на Go с поддержкой дженериков

Automi — это библиотека для построения стриминговых data pipeline’ов на Go. Теперь с полной поддержкой дженериков, что даёт массу преимуществ:

Типобезопасность — ошибки ловятся во время компиляции
Меньше шаблонного кода — без interface{} и кастов
Быстрее выполнение — нет runtime-ассертов
Удобство разработки — автодополнение и понятные ошибки в IDE

🧠 Как это работает:
Данные проходят через цепочку операций:

Источник → Фильтр → Map → Sink

Каждый элемент обрабатывается по ходу, не загружая всё в память.

📌 Подходит для:
• Обработки больших объёмов данных
• ETL/streaming задач
• Писать понятные, типизированные пайплайны на Go

Github

@golang_google