Библиотека Go-разработчика | Golang
23.9K subscribers
2.74K photos
50 videos
88 files
5.36K links
Все самое полезное для Go-разработчика в одном канале.

Учиться у нас: clc.to/qaSdww

По рекламе: @proglib_adv

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0

#WXSSA
Download Telegram
🤨 Как заставить AI-агента не ломать архитектуру, а нормально писать код?

Мы привыкли общаться с ИИ промптами, но для автономных систем это путь к бесконечным циклам и сливу бюджета. Чтобы убрать хаос, инженеры переходят на Spec-Driven Development (SDD).

Вот как этот подход меняет работу агента на практике:

🔹Контракт вместо текста. Сначала пишется строгая спецификация (JSON-схема/OpenAPI) и автотесты. Агент зажат в рамки интерфейсов, за которые физически не может выйти.
🔹Контроль на шагах. Внутри петли Think-Act-Observe агент сверяет действия со спецификацией.
🔹Саморефлексия. Если ИИ нарушил типы или «додумал» лишнее, тест падает. Агент получает ошибку в контекст и сам правит код, не выходя за рамки ТЗ.

Это лишь база того, как укротить ИИ-разработку. Если вы хотите глубоко внедрить эту методологию, научиться проектировать архитектурные контракты и собирать отказоустойчивые системы — оставляйте заявку на наш новый курс по Spec-Driven Development. Стартуем совсем скоро🙂
👀 Инфографика по каналам

➡️ Сохраняйте к себе, чтобы не потерять

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoVisual
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Media is too big
VIEW IN TELEGRAM
🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»!

Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях.

Что внутри видео:

- Почему ассистент и агент принципиально разные сущности;
- Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему;
- Как понимать архитектуру глубже, чтобы проектировать сильные решения.

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

🔗 Забрать бесплатный демо-урок
🔮 Прогноз для IT-рынка после 2027 года

Кажется, что рынок умер: вакансий меньше на 20-35%, зарплаты растут медленнее инфляции, hh-индекс в IT перевалил за 14. Но если наложить сегодняшний спад на три предыдущих цикла — доткомы, 2008-й и пандемию — картина выглядит иначе.

Что будет дальше: где ждать взрывного роста вакансий в 2028-2030, почему разрыв в зарплатах может достичь 50-120% и что делать в ближайшие полтора года, чтобы оказаться на правильной стороне этого разрыва.

➡️ Ответы в статье

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔21🥱1
🛩 FlightRecorder в проде

В Go 1.25 в стандартную библиотеку завезли trace.FlightRecorder — кольцевой буфер трассировки, который постоянно крутится в памяти, а по команде Snapshot() отдаёт последние N секунд событий рантайма. Идея: сэмплирующий профайлер видит «среднюю температуру», а тут вы получаете полную картину именно того момента, когда всё пошло не так.

Пара примеров:

▪️ Ловля хвостовых задержек

Мидлварь замеряет время обработки запроса, и если оно перевалило за исторический p95 (или прилетела 500-ка) — асинхронно дёргается снапшот.

Бинарный дамп улетает в S3, ссылка логируется в Grafana. Сработал алерт → кликнули по ссылке → скачали дамп → go tool trace slow-trace.out.

▪️ Проблемы шедулера и GC

Всё, что живёт между сэмплами профайлера: залипания горутин, GC assist, вытеснение горутин с P — на трассе это видно, в профиле нет.

Но есть и обратная сторона: формат данных не дружит с Pyroscope и Datadog, поэтому дамп нельзя просто открыть в дашборде — приходится вручную гонять go tool по конкретному поду. А когда подов больше тысячи, удовольствие ниже среднего. Инструмент мощный, эргономика — пока нет.

💬 А вы пробовали FlightRecorder? Для чего включали, что нашли такого, чего не показал pprof, и как вытаскивали трейсы с
прода?

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥2🥰1😢1
⭐️ Тип в композитных литералах станет необязательным

Предложение №12854 висело в трекере с 2015 года и наконец получило статус accepted.

Теперь тип литерала можно будет опускать везде, где компилятор выводит его из контекста:
var x []string = {"a", "b", "c"}
return {}, err
compress.NewReader(r, {Level: compress.BestSpeed})
items = append(items, {id, obj, false})


Запись a := {1, 2, 3} останется ошибкой, слева нет явного типа и выводить нечего.

Выигрывают табличные тесты, структуры опций и код с protobuf, где имена типов повторяются десятками. Спор о читаемости команда закрыла так. gofmt не будет принудительно удалять типы, стиль сложится сам, а gopls получит подсказки, которые покажут пропавшее имя типа прямо в редакторе.

В Go 1.27 фича не попадёт. Изменение в компиляторе простое, но нужно обновить экосистему инструментов, поэтому ориентир это Go 1.28.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🙏53
📰 Дайджест недели

Здесь нет дождей, здесь только новости

Go теперь компилирует TypeScript

Microsoft выкатила TypeScript 7.0 — компилятор целиком переписан с TS на Go. Итог: сборки быстрее в 8-12 раз при меньшем потреблении памяти на 6-26%

Ускорение in-memory кеша до 8 раз

Фреймворк, где файловая система это карта маршрутов

Результат джуна близок к нулю

Бонусы-призраки и грейды из параллельной вселенной

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 События публикуются дважды

Сервис сохраняет заказ в БД и сразу публикует событие OrderCreated. Выглядит логично, но БД и очередь это две отдельные системы.

Что может произойти: БД коммитилась, но публикация упала. Заказ есть, события нет. Клиент повторяет запрос из за таймаута. Событие публикуется еще раз. Нижестоящий сервис видит два события и создает два заказа вместо одного.

➡️ Решение: Outbox паттерн

Сохраняем заказ и событие в одной БД транзакции. Отдельный диспетчер читает неотправленные события и публикует их позже. Если диспетчер упадет или повторится, событие уже в БД и не потеряется.
// В одной транзакции
BEGIN
INSERT INTO orders ...
INSERT INTO outbox ...
COMMIT

// Отдельно
func dispatchOutbox() {
events := store.GetUnsent()
for _, e := range events {
publisher.Send(e)
store.MarkSent(e.ID)
}
}


➡️ Ключевые моменты

Каждое событие должно иметь уникальный ID. Потребители должны быть идемпотентные (игнорировать дубликаты). Outbox паттерн гарантирует, что событие не потеряется, но не гарантирует ровно одну доставку. Это нормально, если потребители правильно обрабатывают дубликаты.

➡️ Что делать

Добавьте таблицу outbox. Вставляйте заказ и событие одной транзакцией. Запустите диспетчер, который периодически отправляет события из outbox. Добавьте уникальный event_id потребителям для фильтрации дубликатов.

Граница между микросервисами это самое опасное место. Outbox паттерн это простой способ сделать ее безопаснее.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🥱3
🚀 Уже завтра стартует новый поток курса «ИИ-агенты»!

Мы собрали мощнейший состав преподавателей. Учить вас проектировать архитектуру и собирать продакшн-агентов будут инженеры и исследователи из топовых IT-компаний.

Старт уже завтра!

Сомневаетесь, подойдет ли вам программа и подача? Начните с бесплатного демо-урока!

Всего за 2 часа вы заглянете под капот ИИ-агента, поймете, чем мышление модели отличается от ее ответа, и научите систему чинить собственный код. Это идеальный способ протестировать нашу платформу перед покупкой.

🔗 Пройти демо-урок и занять место на курсе
👀 20 ошибок, которые пропустит компилятор

Собрали в карточках ошибки, которые можно отловить на код-ревью.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoVisual
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43😢1😍1
🎸 Конференция, которая заканчивается концертом

ИТ-Пикник 2026 — это не только доклады. Музыкальный хедлайнер — LAB, шоу Антона Беляева и команды Therr Maitz: популярные треки в новых аранжировках с оркестром и хором. А ещё ИТ-Квартирник — отдельная сцена для музыкантов из мира технологий, где семь команд из опен-колла борются за право выйти на главную сцену с Pompeya.

➡️ Собрали всё, что известно о фестивале

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Стартуем СЕГОДНЯ! Новый поток курса «Разработка ИИ-агентов» открыт

По этому поводу мы решили выложить закрытую запись одного из уроков из программы. Найти её в поиске YouTube нельзя — она доступна только по ссылке и всем, кто будет на курсе.

Внутри глубокий разбор LLM от Алексея Яндутова (Senior ML-инженер, развивал ответы «Алисы» и «Нейро» в Яндексе). Учимся получать точный результат без галлюцинаций.

Что внутри урока:

- Устройство LLM.
- Рабочие шаблоны промптов (Persona, Chain-of-Thought и др.).
- Разбор реального кейса Яндекса. Как автоматизировать разметку, обойти качество людей на 5% и срезать косты на 60%.


После просмотра вы поймете, когда хватает промпт-инжиниринга, а когда нужен RAG или fine-tuning.

👉Смотреть закрытый урок на YouTube

Понравился урок? Переходите на новый уровень! Оставляйте заявку на курс, чтобы научиться проектировать надежные автономные системы. Обучение началось, но вы еще успеваете присоединиться.

🔗 Занять место на курсе
⭐️ Пишем долгоживущую программу на Go с GOGC=off. Часть 1, GOMEMLIMIT

Короткий ответ: да, но не так, как обычно себе это представляют. Полностью выключенный сборщик мусора почти всегда означает, что программа рано или поздно съест всю память. Работающие варианты сводятся к тому, что GC не выключается совсем, а перестаёт запускаться по росту кучи и начинает запускаться по вашим правилам.

В этой части разберём, что делает GOGC=off, почему наивный вариант падает, и самый практичный способ жить без сборок, связку с GOMEMLIMIT.

➡️ Что делает GOGC

GOGC задаёт, насколько куча должна вырасти относительно живых данных, прежде чем начнётся следующий цикл сборки. При значении по умолчанию 100 сборка стартует, когда куча удвоилась относительно объёма живых объектов после прошлого цикла. При GOGC=200 цикл будет реже и памяти уйдёт больше. При GOGC=off триггер по росту кучи пропадает совсем.

То же самое можно сделать из кода:
import "runtime/debug"

func main() {
debug.SetGCPercent(-1) // эквивалент GOGC=off
// ...
}


Важно понимать, что аллокатор при этом никуда не девается. Программа продолжает выделять память, просто освобождать её никто не будет. Каждый временный слайс, каждая строка от fmt.Sprintf, каждый заголовок HTTP запроса остаются в куче навсегда. Для батча, который живёт три секунды и завершается, это идеально. Для сервиса, который работает неделями, это утечка по определению.

➡️ Почему наивный вариант падает

Возьмём типичный HTTP сервис. Даже если ваш собственный код не аллоцирует, стандартная библиотека аллоцирует за вас. net/http создаёт объекты на каждый запрос, encoding/json создаёт их на каждый декод, драйвер базы создаёт их на каждый ряд. При тысяче запросов в секунду и паре килобайт мусора на запрос вы получаете около двух мегабайт в секунду, то есть примерно семь гигабайт в час. Дальше приходит OOM killer.

Поэтому вопрос не в том, можно ли выключить GC, а в том, чем заменить триггер, который вы выключили.

➡️ GOMEMLIMIT как замена триггера

GOMEMLIMIT — самый практичный подход и он появился в Go 1.19. Комбинация GOGC=off и GOMEMLIMIT даёт сборщик, который не реагирует на рост кучи вообще, но запускается, когда потребление памяти приближается к заданному лимиту.
GOGC=off GOMEMLIMIT=4GiB ./myservice


Или из кода:
debug.SetGCPercent(-1)
debug.SetMemoryLimit(4 << 30) // 4 GiB


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

Что вы теряете. Если объём живых данных сам по себе дорастает до лимита, GC начнёт запускаться непрерывно и программа уйдёт в смерть от сборки, когда почти всё время уходит на бесполезные циклы. Лимит поэтому ставят с запасом относительно ожидаемого объёма живых данных, а не впритык к памяти контейнера. Разумная практика ставить GOMEMLIMIT процентов на десять ниже лимита пода, чтобы GC успел среагировать раньше, чем это сделает cgroup.

Ещё одна тонкость. GOMEMLIMIT учитывает всю память рантайма, включая стеки горутин и служебные структуры, но не учитывает то, что выделено вне рантайма, например через cgo или mmap. Если такого много, лимит надо занижать дополнительно.

➡️ Про ballast

Раньше был популярен трюк с большим фиктивным слайсом, который выделяли на старте, чтобы поднять порог срабатывания GC. Сейчас он не нужен. GOMEMLIMIT решает ту же задачу.

Итог первой части

GOGC=off сам по себе это не оптимизация, а отложенный OOM. Но GOGC=off вместе с GOMEMLIMIT вполне живёт в проде годами. Сборщик молчит на нормальной нагрузке и вступает в дело только у границы, которую вы задали сами.

Во второй части посмотрим на два более жёстких варианта. Ручные вызовы runtime.GC() в окнах простоя и код, который вообще не аллоцирует после старта.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
4👏3
🔒 age, шифрование файлов без конфигов и без GPG

Надо зашифровать бэкап, дамп базы или файл с секретами. Классический ответ это GPG, а вместе с ним keyring, сеть доверия, десяток флагов и вывод, который не прочитать без документации. Для одной операции это перебор.

age делает ровно эту задачу и ничего больше. Инструмент шифрования файлов, формат и Go библиотека от Филиппо Вальсорды. Маленькие явные ключи, никаких опций конфигурации, поведение в духе UNIX. Формат описан спецификацией age-encryption.org/v1.

Базовый сценарий

Три команды:
$ age-keygen -o key.txt
Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p

$ tar cvz ~/data | age -r age1ql3z7... > data.tar.gz.age

$ age -d -i key.txt data.tar.gz.age > data.tar.gz


Публичный ключ это одна строка с префиксом age1, приватный одна строка с префиксом AGE-SECRET-KEY-1. Никакого keyring и никакого состояния на диске кроме файла с ключом.

Что ещё умеет

Флаг -r можно повторять, тогда файл расшифрует любой из получателей. Список получателей удобнее держать файлом и передавать через -R. Флаг -p шифрует паролем, причём при пустом вводе age сгенерирует стойкую фразу сам. Флаг -a даёт текстовый PEM вывод, если файл надо вставить в письмо или в YAML. При расшифровке тип файла определяется автоматически.

Приятно, что можно шифровать на обычные SSH ключи:
$ age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age
$ age -d -i ~/.ssh/id_ed25519 example.jpg.age > example.jpg


Отсюда трюк с GitHub, где публичные ключи лежат по адресу вида github.com/username.keys:
$ curl https://github.com/benjojo.keys | age -R - example.jpg > example.jpg.age


С версии 1.3.0 есть гибридные постквантовые ключи через age-keygen -pq. Цена в том, что публичный ключ получателя разрастается примерно до двух тысяч символов.

Как библиотека

CLI это обёртка над пакетом filippo.io/age:
recipient, _ := age.ParseX25519Recipient(pubKey)

out := &bytes.Buffer{}
w, err := age.Encrypt(out, recipient)
if err != nil {
log.Fatal(err)
}
io.WriteString(w, "секретные данные")
w.Close() // обязателен, иначе не запишется финальный блок


Всё построено на io.Reader и io.Writer, поэтому поток по сети шифруется так же, как строка в памяти. Расшифровка через age.Decrypt с age.ParseX25519Identity.

Ставится из репозиториев почти везде, либо командой go install filippo.io/age/cmd/...@latest.

age стоит брать, когда нужно зашифровать файл и не хочется тащить модель доверия GPG. Подписей, отзыва ключей и сети доверия здесь нет и не будет. Это не замена GPG во всём, а замена в той задаче, ради которой его чаще всего и запускают.

➡️ Репозиторий

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
8