Библиотека Go-разработчика | Golang
23.7K subscribers
2.4K photos
48 videos
87 files
4.84K links
Все самое полезное для Go-разработчика в одном канале.

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

Учиться у нас: https://proglib.io/w/32d20779

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Строим надёжные AI-системы: инженерный подход

Для тех, кто ценит производительность и строгий контроль. Мы учим создавать автономных ИИ-агентов как управляемые компоненты архитектуры с предсказуемым поведением.

В программе:

логика на `LangGraph` для перехода от ненадёжных цепочек к детерминированным графам;
реализация `RAG` с использованием векторных хранилищ для точной работы с данными;
автоматизация пайплайнов через n8n и Python для интеграции в существующий бэкенд;
мониторинг рантайма через LangSmith для контроля качества и затрат на токены.

Постройте устойчивую AI-инфраструктуру, готовую к нагрузкам.

Регистрация
4😁1
🛠 Оживляем старую ветку ребейзом

Разработка затянулась, релизная ветка ушла вперёд. Мерж конфликтует всем подряд, коммит разрастается до эпика.

Решение:
git pull --rebase origin release/3.2.0


Git останавливается на проблемных коммитах. Чиним, коммитим изменения, git rebase --continue. В конце git push --force-with-lease. Безопасно перезапишет remote.

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74
🆘 Без замков: неизменяемые данные в Go

Общие данные под нагрузкой — боль мьютексов. Вместо мьютексов для общих данных используйте неизменяемые структуры. Параллельное чтение бесплатно.

Пример: общий конфиг
type Config struct {
LogLevel string
Timeout time.Duration
Features map[string]bool
}

func NewConfig(...) *Config {
copied := make(map[string]bool, len(features))
for k, v := range features { copied[k] = v }
return &Config{..., Features: copied}
}

var current atomic.Pointer[Config]
current.Store(NewConfig(...))
func GetConfig() *Config { return current.Load() }


Затем читаем из конфига:
cfg := GetConfig(); 
if cfg.Features["beta"] { ... }


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

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥4👍2🥱1
👥 Топ-вакансий для Go-разработчиков за неделю

Go Intern — 60 000 ₽. Лучше вакансии для начинающих найти сложно.

Middle Go-Developer — от 200 000 ₽

Senior Golang Engineer — от 325 300 ₽ с удалёнкой.

➡️ Еще больше топовых вакансий — в нашем канале Go jobs

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

#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
🎅 Секретный Санта для айтишников от Proglib.academy

Весь этот год команда Академии запускала курсы для айтишников. А под Новый год мы запускаем новый курс по ИИ-агентам и ставим под ёлку самый свежий стек 2025 года и обучение проектированию автономных нейросетевых экосистем — от LLM и ReAct-циклов до мультиагентных систем, LangGraph, AutoGen и продакшн-практик.

🎁 Хотим дарить подарки и приглашаем вас поучаствовать в конкурсе:

1️⃣ Упомяните курс Академии у себя в блоге.
2️⃣ Пришлите скрин сюда.
3️⃣ Получите секретный промокод на 10 000 ₽ при оплате любого курса.

Подходит всё — соцсети, блоги, Telegram-каналы от 300 подписчиков и более.

🎄 Акция действует до Нового года.

Win-win, всё как мы любим!
Нет значит нет

No as a Service это маленький HTTP сервис который по GET запросу возвращает JSON с рандомной причиной отказа.

Скидывайте в комменты какой ответ попался вам 👇


➡️ Получить свой отказ

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

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

#GoTalk
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19🤔2❤‍🔥1
WANTED: GO-ЭКСПЕРТ

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

Приметы:

— профессионально пишет на Go (приветствуется опыт в Python или Java);
— понимает внутреннее устройство горутин и планировщика;
— умеет объяснять сложные вещи просто и без лишней воды;
— готов стать лицом большой площадки Proglib.

Твоя награда:

— статус эксперта в Proglib Academy;
— достойная оплата за подготовку контента;
— медийный вес в Go-комьюнити.

Явка с повинной

P.S. Твой лид — фанат Golang? Пора его сдать нам.
👍4😢4
⚡️ RACK сделал интернет-соединения в Go на 71% быстрее

Pion — библиотека на Go для видеозвонков и чатов в браузере. Они улучшили протокол передачи данных, добавив RACK. Теперь скорость выросла на 35%, задержки упали на 25%, CPU тратит меньше на 21%.

Раньше при потере пакетов программа ждала таймер или 3 жалобы от получателя — и пересылала всё заново. RACK смотрит на время: "Сколько прошло с последнего подтверждения?" Шлет тестовый пакет, быстро понимает, что потерялось, и пересылает только нужное.

➡️ Блог разработчиков

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1831
👀 Iota в Go чтобы не нумеровать константы руками

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

Iota работает внутри блока const и ведет себя как счетчик. В начале каждого const блока он сбрасывается в 0, потом увеличивается на 1 на каждой строке с константой.

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

type Status int

const (
StatusPending Status = iota
StatusProcessing
StatusDone
StatusFailed
)


Если нужно начать не с нуля, добавляем смещение.

const (
PriorityLow = iota + 1
PriorityMed
PriorityHigh
)


Еще полезный паттерн это флаги через битовый сдвиг. Тогда каждое значение это отдельный бит и их можно комбинировать через побитовое или.

type Perm uint8

const (
PermRead Perm = 1 << iota
PermWrite
PermExec
)


Если значения не последовательные и зависят от математики или внешнего стандарта, проще записать числа явно.

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

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍163👾2🥱1
Что выведет код

Сериализуем nil-указатель в JSON. Ошибка? Паника? Или всё пройдёт гладко? Попробуйте ответить до того, как посмотрите ответ 👉 в нашем канале с задачами

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

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

#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱92👍1
🤩 Table driven tests в Go

Обычная история: есть функция и десять сценариев. Если писать по тесту на каждый сценарий, код быстро превращается в копипасту. Table driven подход делает один тест, а сценарии складывает в таблицу.

Вы описываете кейсы в таблице, обычно это слайс структур. Потом в цикле запускаете каждый кейс как сабтест через t.Run, чтобы у каждого сценария было имя и его можно было запустить отдельно.

Пример на простой функции:
func Split(s, sep string) []string {
return strings.Split(s, sep)
}

func TestSplit(t *testing.T) {
tests := []struct {
name string
input string
sep string
want []string
}{
{name: "simple", input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}},
{name: "no sep", input: "abc", sep: "/", want: []string{"abc"}},
{name: "trailing", input: "a/b/c/", sep: "/", want: []string{"a", "b", "c", ""}},
}

for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
got := Split(tc.input, tc.sep)
if !reflect.DeepEqual(got, tc.want) {
t.Fatalf("want %v got %v", tc.want, got)
}
})
}
}


Еще мелочь, но полезная. Внутри сабтеста t.Fatal завершает только текущий сабтест, а не весь набор, поэтому для table driven тестов это часто удобнее чем тянуть continue и пачку if.

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

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Мультиагентные системы: следующий этап после микросервисов 🚀

Как заставить десятки ботов работать слаженно? Ответ кроется в оркестрации и правильных паттернах. Мы научим вас строить высокопроизводительные системы AI-агентов.

Технологический фокус:

— сборка экосистемы ботов с использованием CrewAI и AutoGen;
— оркестрация процессов и внешних API через n8n;
— использование протокола MCP для эффективного обмена данными;
— оптимизация RAG для доступа к знаниям за миллисекунды.

Поймёте архитектуру «мозга» агента (ReAct) и соберёте дипломный проект: группу автономных сущностей для решения сложных бизнес-задач.

Прокачать навыки
🕺 Итоги года

Последний дайджест 2025 года. Пришла пора подвести итоги самых запоминающихся событий минувших 365 дней.

Февраль — Go 1.24

• Теперь псевдонимы типов поддерживают параметры:
type Set[T comparable] = map[T]bool
type Pair[T any] = struct { First, Second T }


• Встроенные map полностью переписали. Новая реализация на базе Swiss Tables вместо хэшмапы.

Август — Go 1.25

• Раньше GOMAXPROCS устанавливался по числу CPU хоста. Теперь runtime учитывает cgroup-лимиты и автоматически подстраивается. Если лимит CPU ниже числа ядер хоста — GOMAXPROCS возьмёт меньшее значение.

• Green Tea — экспериментальный сборщик мусора

• Постквантовая криптография из коробки

По данным JetBrains:

• 2.2 млн разработчиков используют Go как основной язык

• 11% всех разработчиков планируют изучить Go в ближайший год

Фреймворки

• Gin остаётся лидером — 48% Go-разработчиков
• Fiber растёт — 11%
• Echo стабилен — 16%
• Beego теряет позиции

Инструменты

• GoLand удерживает 47% рынка.
• Cursor уже используют 6% Go-разработчиков.

И было много более мелких, но не менее важных апдейтов, которые можно найти по хэштегу #GoLive

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🎉3
👀 Два дня до Нового года

В этом декабре 2025 рабочая неделя сжалась до минимума. Только понедельник и вторник в деле, а дальше праздники до 12 января.

Для разработчиков такие дни часто превращаются в формальность. Кто-то доделывает мелкие таски, чтобы Jira не напоминала в отпуске.

Другие чистят код от предупреждений линтера или пишут тесты, которые откладывали месяцами. Есть и те, кто просто мониторит продакшн, попивая кофе у монитора.

💬 Что будете делать вы? Делитесь микро-планами на микро-неделю 👇

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

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

#GoTalk
Please open Telegram to view this post
VIEW IN TELEGRAM
5👾1
👨‍💻 Отличаем отсутствие значения от нулевого значения

В Go важно понимать что произошло при чтении данных. Значение реально есть или это просто нулевое значение. Для этого в языке есть привычная конструкция value, ok.

Самый частый кейс это map. Если обратиться к мапе по ключу и ключа нет, Go вернет нулевое значение типа. Проблема в том, что нулевое значение может быть и настоящим значением.

Пример:
users := map[int]string{
1: "Alice",
2: "",
}

name := users[2] // вернет пустую строку и непонятно почему
missing := users[99] // тоже пустая строка и опять непонятно почему

name2, ok2 := users[2] // ok2 true
missing2, ok3 := users[99] // ok3 false

_ = name
_ = missing
_ = name2
_ = missing2


Если нужно только проверить наличие ключа, значение можно игнорировать через _:
if _, ok := users[42]; !ok {
// ключа нет
}


Второй важный кейс это type assertion. Когда есть interface{} и нужно безопасно проверить что внутри лежит конкретный тип, запись s, ok := v.(string) не падает с panic и позволяет обработать ситуацию нормально.

Пример:
var v any = "hello"

s, ok := v.(string)
if ok {
_ = s
} else {
// внутри не string
}


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

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍162
🎄 Забудьте time.Sleep

time.Sleep выглядит просто для пауз в коде, но игнорирует контекст. При shutdown функция досидит задержку и только потом проверит ctx.Done().

В цикле типа for { work(); time.Sleep(5*time.Second) } сигнал отмены не прервёт сон. Функция проснётся, выполнит код и упадёт с ошибкой. В проде это растягивает graceful shutdown.

Лучше select { case <-ctx.Done(): return; default: time.Sleep(d) }. Но sleep всё равно ждёт полного времени — до 5 секунд задержки.

Ещё хуже: time.After(d) создаёт таймер каждый раз, аллоцирует память и утечь.

Оптимально — один таймер:
t := time.NewTimer(d)
for {
select {
case <-ctx.Done():
if !t.Stop() { <-t.C }
return
case <-t.C:
t.Reset(d)
}
work()
}


Таймер переиспользуется, останавливается чисто. Ticker не подходит: тикает независимо от длительности work(), может запускать задачи внахлёст.

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

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👏15👍41👾1
🤔 Не знаете, в чём встречать Новый год? Не беда!

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

Реклама. ИП Михайлишина Гузель Фаниловна.
ИНН 165042823905. Erid 2VtzqukJLdp
😁91👍1
📊 Лучший драйвер для SQL запросов

Свежее сравнение трёх SQLite драйверов в Go 1.25.2: mattn/go-sqlite3, modernc/sqlite, ncruces/go-sqlite3. Тесты на 15 платформах от M1 до RISC-V.

Modernc выиграл общий зачёт. Лучше читает данные и работает с нагрузкой. Mattn хорош только на вставку. Ncruces просто третий.

➡️ Полный бенч тут

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤔51
💻 Переменные прямо в if

В Go можно объявлять переменные прямо в условии if. Это помогает не разносить временные переменные по всей функции и не держать их живыми дольше чем нужно.

Синтаксис выглядит так
if init statement; condition { ... } else { ... }

Init statement выполняется перед проверкой условия, а переменные из него доступны в condition и в ветках if и else, но не доступны после if.

Самый популярный кейс это обработка ошибок рядом с вызовом функции:
if f, err := os.Open("config.json"); err != nil {
// ошибка открытия
} else {
defer f.Close()
// работа с f
}


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

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍7🥱3