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

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

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

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

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

#WXSSA
Download Telegram
😳 Documentation Driven Development звучит как ещё один модный термин. Пока не попробуешь объяснить свой проект AI.

Агент работает только с тем контекстом, который ему дали. Если документация неполная или устарела, он начинает додумывать — отсюда появляется неверный код.

🔘 На курсе «ИИ для разработчиков» эту тему разбирает Арсений Харланов. Он покажет, как подготовить документацию и контекст, чтобы агент понимал архитектуру проекта, ограничения и связи между компонентами.

Также разберём, как выбирать модель под задачу: Claude, DeepSeek, Qwen и другие ✏️

Впереди 7 недель работы со своим репозиторием. Вебинары проходят вживую и остаются в записи.


Стартуем 31 августа. До конца июля можно присоединиться по ранней цене, а доступ к материалам останется бессрочным 😀

🔗 Посмотреть, что будет на курсе

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
😁32👍1🤔1
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁27🔥42👾2❤‍🔥1
⚡️ Идеи проектов на Go

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

Для старта

• Утилита командной строки. Го собирается в один бинарник, раздавать удобно.

• Поиск дубликатов файлов по хешу, свой аналог grep, конвертер csv в json. Освоите флаги, чтение из потока и работу с файлами.

Конкурентность

• Чекер доступности сайтов опрашивает адреса параллельно, десять штук проверяются за время самого медленного ответа.

• Пул воркеров покажет, зачем каналы и как ограничивать нагрузку.

• Кэш с временем жизни объяснит, почему доступ к карте без блокировки ломает программу.

Сеть и сервисы

• Сокращатель ссылок закроет тему HTTP сервиса и роутинга.

• Прокси научит перехватывать трафик.

• Телеграм бот даст практику с внешним API и вебхуками.

Ближе к продакшену

• База ключ значение с журналом на диске покажет как организовать долговечность данных.

• Rate limiter познакомит с токен бакетом.

• Сборщик метрик научит работать с системными вызовами.

Берите задачу, которая пригодится вам самим. Начните с утилиты и усложняйте.

💬 Делитесь своими идеями для проектов

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

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

#GoTalk
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6😢1
Please open Telegram to view this post
VIEW IN TELEGRAM
😢19😁62😍1👾1
Куда на самом деле уходят токены во время агентного кодинга? ⚡️
😱 Знакомо? Лимит уже закончился, а задача всё ещё не готова. Часть токенов могла уйти на повторное чтение файлов, лишний контекст и неудачные попытки.

⚡️ Этому посвящён отдельный блок курса «ИИ для разработчиков». Вы разберёте расходы на собственных проектах, сравните подходы и найдёте места, где агент выполняет лишнюю работу.

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


До 31 июля курс можно купить со скидкой, а все материалы останутся в бессрочном доступе.

🔗 Узнать подробности о курсе

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱101🤔1🤩1👾1
📎 В Go предложили переносимый SIMD, не привязанный к архитектуре

В трекере Go появилось предложение #78902 о переносимом SIMD API. Автор — David Chase из команды компилятора. Это второй уровень поверх той работы над SIMD, что описана в проекте #73787. Важно сразу оговорить статус. Это предложение в состоянии Active, оно ещё обсуждается и не принято.

Напомним контекст. В Go 1.26 уже появился экспериментальный пакет simd/archsimd, который включается через GOEXPERIMENT=simd. Он даёт доступ к SIMD-инструкциям конкретной архитектуры, то есть вы работаете напрямую с типами вроде Float32x8 и должны сами учитывать, что доступно на целевом процессоре. Новое предложение решает другую боль. Писать под каждую архитектуру и под каждую ширину вектора отдельно неудобно, а код получается непереносимым.

Идея в том, чтобы дать абстрактный интерфейс к SIMD-векторам, не завязанный ни на архитектуру, ни на длину вектора. Там, где инструкции есть, API работает быстро. Там, где их нет, он сохраняет переносимость за счёт эмуляции. При запуске на разных вариантах одной архитектуры библиотека сама выбирает лучший доступный набор, например переключается между AVX, AVX2 и AVX512.

В первой версии список операций небольшой. Это пересечение SIMD API для wasm и текущего amd64. Набор скромный, зато его проще эмулировать на платформах без SIMD и проще поддержать при добавлении новых архитектур. Типы названы по образцу заглавной буквы и множественного числа, например Int8s или Float64s.

Внутри одного запуска программы все векторы имеют одинаковую длину в битах, поэтому их можно переинтерпретировать методами вида x.AsFloat64s(). Маски вынесены в отдельную абстракцию, потому что архитектуры реализуют их по-разному. У типов есть методы .Masked(mask) и .Merged(valueIfFalse, mask), а сами маски комбинируются через And и Or.

Предусмотрен и спуск на уровень конкретной архитектуры через ToArch() и обратно через ToSimd(), хотя в прототипе этого пока нет. По задумке это выглядит так:
//go:build amd64

import (
"simd"
"simd/archsimd"
)

func sum(x simd.Float32s) float32 {
switch a := x.ToArch().(type) {
case archsimd.Float32x8:
a = a.AddPairsGrouped(a)
a = a.AddPairsGrouped(a)
return a.GetLo().GetElem(0) + a.GetHi().GetElem(0)
case archsimd.Float32x16:
// ...
case archsimd.Float32x4:
// ...
}
}


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

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

Есть черновой CL 763100, где сам API лежит в simd/mocks.go и генерируется автоматически. Пробовать в проде рано, но за направлением стоит следить, если вам важна производительность на горячих циклах.

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1121👏1💯1
⚡️ Highload на Go: System Design, Kubernetes и микросервисы под нагрузкой — новый курс на Mentorix

Highload глазами Go-инженера: как проектировать, писать и эксплуатировать сервисы, которые держат нагрузку. С расчётами и симуляциями, как на реальных собеседованиях.

⚙️ Внутри: перцентили и SLO, конкурентность и профилирование, кэширование, rate limiting, ретраи и circuit breaker, очереди, БД под нагрузкой, Kubernetes, system design
🧩 118 задач с автопроверкой — вся практика на Go
🎓 Сертификат · доступ навсегда
▶️ Часть уроков открыта — начать можно бесплатно

🏷 −50% — скидка действует 24 часа
19 990 ₽9 995 ₽

Забрать курс со скидкой

━━━━━━━━━━━━━━

Курс продвинутый — предполагает уверенный Go. Если хотите подтянуть базу, на платформе есть бесплатные курсы:

🧩 Тренажёр Go — 70 задач с автопроверкой
⚡️ Golang — основы языка
Сети для разработчиков: TCP/IP, HTTP, DNS

📚 Все бесплатные курсы Mentorix
3
Как ограничить число одновременных запросов к внешнему API? Какой примитив возьмёте и почему

Вопрос с ловушкой прямо в формулировке — и на ней спотыкается половина кандидатов.

Подсказка: прежде чем называть примитив, спросите — а что именно ограничиваем? «Не больше 10 одновременно» и «не больше 100 в секунду» — две разные задачи с разными инструментами. Перепутаете — ответите не на тот вопрос.

Дальше просто: для «одновременно» есть классический примитив, который в Go делается на одном канале особого типа (почему именно такого — тоже любят спросить). А в проде берут готовую обёртку из golang.org/x/... — тот же механизм, но с ошибками, Wait и отменой через контекст.

➡️ Как называется примитив, почему канал именно chan struct{} и что за обёртка — полный разбор

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

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

#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
2
💡 Дженерик-методы в Go 1.27. Цепочки вызовов без функций уровня пакета

Если вы писали API на дженериках, то наверняка сталкивались с этим ограничением. До Go 1.27 метод не мог объявить собственный параметр типа. Из-за этого операции вроде Map приходилось выносить в функции уровня пакета, а вместо привычных цепочек вызовов использовать отдельные функции.

🅰️ В Go 1.27 это ограничение сняли. Теперь методы могут объявлять собственные параметры типа, благодаря чему API становится естественнее, а код — чище и удобнее для чтения 😧

Особенно это пригодится авторам библиотек, fluent API, builder-паттернов и различных коллекций: операции преобразования можно размещать непосредственно на типе, а не рядом с ним.


⚠️ Но есть важное ограничение. Интерфейсы по-прежнему не могут объявлять методы с параметрами типа, поэтому обобщённый метод нельзя использовать для реализации метода интерфейса. Это осознанное решение авторов Go, а не временное ограничение.

Go 1.27 ожидается в августе 2026 года, а новую возможность уже можно попробовать в Release Candidate 🔗

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥93👾2
🧑‍💻 Почему каждому запросу в GORM нужен context.Context

Во многих примерах можно увидеть такой код:


db.Find(&users)


Для небольших проектов это работает. Но в production почти всегда стоит выполнять запросы с context.Context.

Если запрос к базе данных зависнет или окажется слишком долгим, Context позволяет отменить его по таймауту или при завершении HTTP-запроса

🔴 Самый простой вариант — задать таймаут:


ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

err := db.WithContext(ctx).Find(&users).Error


Если запрос не успеет выполниться за две секунды, драйвер базы данных попытается отменить его, а GORM вернёт ошибку.

🔴 В HTTP-приложениях ещё лучше использовать контекст самого запроса:


func GetUsers(w http.ResponseWriter, r *http.Request) {
var users []User

if err := db.WithContext(r.Context()).Find(&users).Error; err != nil {
// ...
}
}


Если клиент закроет соединение или сервер отменит запрос, операция в базе тоже будет прервана.

Context стоит использовать практически во всех серверных приложениях: HTTP API, gRPC, фоновых задачах и сервисах, работающих с внешними ресурсами Это позволяет избежать бесконечно выполняющихся запросов и делает приложение устойчивее к сбоям.

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱84👍2