ru
Feedback
Библиотека Go-разработчика | Golang

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

Открыть в Telegram

Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 #WXSSA

Больше

📈 Аналитический обзор Telegram-канала Библиотека Go-разработчика | Golang

Канал Библиотека Go-разработчика | Golang (@goproglib) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 23 901 подписчиков, занимая 5 541 место в категории Технологии и приложения и 27 734 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 23 901 подписчиков.

Согласно последним данным от 21 июля, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -64, а за последние 24 часа — -7, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.32%. В первые 24 часа после публикации контент обычно набирает 6.77% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 2 466 просмотров. В течение первых суток публикация набирает 1 618 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 7.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как навигация, лучшее_из_библиотеки_2025, git, string, golive.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 #WXSSA

Благодаря высокой частоте обновлений (последние данные получены 22 июля, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

23 901
Подписчики
-724 часа
-277 дней
-6430 день

Загрузка данных...

Привлечение подписчиков
июль '26
июль '26
+140
в 2 каналах
июнь '26
+171
в 3 каналах
Get PRO
май '26
+288
в 3 каналах
Get PRO
апрель '26
+249
в 1 каналах
Get PRO
март '26
+216
в 1 каналах
Get PRO
февраль '26
+487
в 7 каналах
Get PRO
январь '26
+346
в 3 каналах
Get PRO
декабрь '25
+370
в 4 каналах
Get PRO
ноябрь '25
+384
в 4 каналах
Get PRO
октябрь '25
+331
в 2 каналах
Get PRO
сентябрь '25
+290
в 0 каналах
Get PRO
август '25
+316
в 4 каналах
Get PRO
июль '25
+317
в 2 каналах
Get PRO
июнь '25
+315
в 0 каналах
Get PRO
май '25
+391
в 5 каналах
Get PRO
апрель '25
+358
в 4 каналах
Get PRO
март '25
+625
в 53 каналах
Get PRO
февраль '25
+527
в 35 каналах
Get PRO
январь '25
+517
в 37 каналах
Get PRO
декабрь '24
+591
в 40 каналах
Get PRO
ноябрь '24
+605
в 52 каналах
Get PRO
октябрь '24
+499
в 36 каналах
Get PRO
сентябрь '24
+676
в 36 каналах
Get PRO
август '24
+580
в 36 каналах
Get PRO
июль '24
+586
в 37 каналах
Get PRO
июнь '24
+467
в 29 каналах
Get PRO
май '24
+674
в 35 каналах
Get PRO
апрель '24
+771
в 36 каналах
Get PRO
март '24
+901
в 31 каналах
Get PRO
февраль '24
+729
в 31 каналах
Get PRO
январь '24
+863
в 27 каналах
Get PRO
декабрь '23
+850
в 29 каналах
Get PRO
ноябрь '23
+608
в 10 каналах
Get PRO
октябрь '23
+697
в 25 каналах
Get PRO
сентябрь '23
+723
в 0 каналах
Get PRO
август '23
+648
в 0 каналах
Get PRO
июль '23
+503
в 0 каналах
Get PRO
июнь '23
+422
в 0 каналах
Get PRO
май '23
+568
в 0 каналах
Get PRO
апрель '23
+365
в 0 каналах
Get PRO
март '23
+841
в 0 каналах
Get PRO
февраль '23
+392
в 0 каналах
Get PRO
январь '23
+395
в 0 каналах
Get PRO
декабрь '22
+384
в 0 каналах
Get PRO
ноябрь '22
+491
в 0 каналах
Get PRO
октябрь '22
+256
в 0 каналах
Get PRO
сентябрь '22
+292
в 0 каналах
Get PRO
август '22
+394
в 0 каналах
Get PRO
июль '22
+472
в 0 каналах
Get PRO
июнь '22
+443
в 0 каналах
Get PRO
май '22
+176
в 0 каналах
Get PRO
апрель '22
+328
в 0 каналах
Get PRO
март '22
+242
в 0 каналах
Get PRO
февраль '22
+135
в 0 каналах
Get PRO
январь '22
+236
в 0 каналах
Get PRO
декабрь '21
+245
в 0 каналах
Get PRO
ноябрь '21
+219
в 0 каналах
Get PRO
октябрь '21
+215
в 0 каналах
Get PRO
сентябрь '21
+290
в 0 каналах
Get PRO
август '21
+298
в 0 каналах
Get PRO
июль '21
+281
в 0 каналах
Get PRO
июнь '21
+196
в 0 каналах
Get PRO
май '21
+389
в 0 каналах
Get PRO
апрель '21
+336
в 0 каналах
Get PRO
март '21
+280
в 0 каналах
Get PRO
февраль '21
+258
в 0 каналах
Get PRO
январь '21
+262
в 0 каналах
Get PRO
декабрь '20
+6 566
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
22 июля+13
21 июля+2
20 июля+3
19 июля+8
18 июля+2
17 июля+8
16 июля+6
15 июля+4
14 июля+3
13 июля+5
12 июля+4
11 июля+6
10 июля+10
09 июля+5
08 июля+13
07 июля+7
06 июля+7
05 июля+6
04 июля+8
03 июля+9
02 июля+7
01 июля+4
\n`))\n\nСтрока javascript:alert(1) в href превратится в #ZgotmplZ, то есть ссылка просто не сработает.\n\n➡️ Где защита отключается\n\nТипы template.HTML, template.JS, template.URL говорят шаблонизатору доверять содержимому и не трогать его. Это законная возможность, но применять её к данным пользователя нельзя:\n// так делать нельзя\ndata.Bio = template.HTML(userInput)\n\nЕсли пользователю действительно нужен HTML, например разметка в комментариях, содержимое надо чистить санитайзером:\nimport \"github.com/microcosm-cc/bluemonday\"\n\np := bluemonday.UGCPolicy()\nsafe := template.HTML(p.Sanitize(userInput))\n\nbluemonday работает по белому списку тегов и атрибутов, всё остальное вырезает.\n\n➡️ API и заголовки\n\nДля JSON ответов достаточно encoding/json, он экранирует <, > и & в escape последовательности. Но заголовок ставить обязательно, иначе браузер может угадать тип и отрендерить ответ как HTML.\nw.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\nw.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\njson.NewEncoder(w).Encode(resp)\n\nХорошая практика добавить Content-Security-Policy, который запрещает инлайновые скрипты. Он не заменяет экранирование, но снижает шанс, что случайная дыра превратится в кражу сессий. Куки сессии стоит помечать HttpOnly, тогда украденный скрипт до них не доберётся.\n\n📍 Навигация: Вакансии • Задачи • Собесы\n\n🐸 Библиотека Go-разработчика\n\n#GoDeep","datePublished":"2026-07-16T07:02:01Z","dateModified":"2026-07-16T07:02:01Z","author":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"publisher":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2250},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":31}]}},{"@type":"ListItem","position":17,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7407","url":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7407","mainEntityOfPage":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7407","headline":"🧑‍💻 В Go захотели поддержку GOARM64=v9.6 В трекере Go появилось предложение №80402. Разработчик просит добави…","articleBody":"🧑‍💻 В Go захотели поддержку GOARM64=v9.6\n\nВ трекере Go появилось предложение №80402. Разработчик просит добавить новое значение переменной GOARM64 со значением v9.6 и тег сборки arm64.v9.6, чтобы тулчейн умел собирать под архитектуру Armv9.6-A.\n\nВместе с версией предлагают включать набор инструкций FEAT_CMPBR автоматически. Он объединяет сравнение и условный переход в одну операцию, в Armv9.6-A обязателен, поэтому отдельная опция не нужна. По умолчанию поведение не меняется, значение пригодится тем, кто собирает под свежие чипы на Armv9.6-A.\n\n📍 Навигация: Вакансии • Задачи • Собесы\n\n🐸 Библиотека Go-разработчика\n\n#GoLive","datePublished":"2026-07-15T18:03:15Z","dateModified":"2026-07-15T18:03:15Z","author":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"publisher":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2594},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}]}},{"@type":"ListItem","position":18,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7406","url":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7406","mainEntityOfPage":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7406","headline":"🔥 Курс «Разработка ИИ-агентов» стартовал, но вы еще успеваете присоединиться! Мы только начали, а первый прак…","articleBody":"🔥 Курс «Разработка ИИ-агентов» стартовал, но вы еще успеваете присоединиться!\n\nМы только начали, а первый практический воркшоп пройдет только 23 июля. До этого времени вы спокойно успеете изучить материалы и нагнать группу. \n\n💼 Главная фишка: финальный проект в портфолио:\n\nВ финальном проекте вы сможете выбрать один из двух вариантов: реализовать свою идею или решить задачу от партнера курса — крупной российской финтех-компании. Вы будете работать с датасетом, построенным по реальным сценариям, получите бизнес-контекст и продовые ограничения. В результате соберете AI-агента, который станет сильным проектом для портфолио.\n\n🎁 Упомяните менеджеру специальное предложение «3 курса по цене 1»: Берете VIP-тариф — получаете курс «Разработка ИИ-агентов», хардкорный «AgentOps» и ещё один курс на выбор. Выгода 129.000 ₽!\n\nДвери потока вот-вот закроются окончательно. Успейте забрать стек курсов и начать работу над реальным проектом \n\n🔗 Занять место и забрать 3 курса","datePublished":"2026-07-15T15:00:46Z","dateModified":"2026-07-15T15:00:46Z","author":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"publisher":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"image":["https://n3.tlmtr.cc/p/_ZNyF2FMPDZDl4JeCxdAvN_AQsZYAq_Ld1rqsjja5fCE?ty=l"],"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2484},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":3}]}},{"@type":"ListItem","position":19,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7405","url":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7405","mainEntityOfPage":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7405","headline":"⭐️ Пишем долгоживущую программу на Go с GOGC=off. Часть 2, ручной GC и код без аллокаций В первой части мы ра…","articleBody":"⭐️ Пишем долгоживущую программу на Go с GOGC=off. Часть 2, ручной GC и код без аллокаций\n\nВ первой части мы разобрали связку GOGC=off и GOMEMLIMIT. Она подходит большинству сервисов и не требует переписывать код. Но есть задачи, где даже редкие циклы сборки в неудачный момент неприемлемы. Торговый бот в момент котировки, игровой сервер внутри тика, обработчик, у которого хвостовые задержки важнее среднего времени ответа.\n\nДля таких случаев есть два более жёстких варианта. \n\n➡️ Вариант первый, ручные циклы в окнах простоя\n\nИдея простая. Вы выключаете автоматический триггер и запускаете сборку сами, но только тогда, когда пауза никому не мешает. Между тиками, между батчами, вне торговой сессии:\ndebug.SetGCPercent(-1)\n\nfor {\n batch := queue.Fetch()\n process(batch) // на этом участке GC не вмешивается\n\n if idle() {\n runtime.GC()\n debug.FreeOSMemory() // ещё и вернуть память операционной системе\n }\n}\n\nruntime.GC() выполняет полный цикл синхронно и возвращает управление, когда он закончен. debug.FreeOSMemory() делает то же самое и дополнительно отдаёт освободившиеся страницы ОС, что полезно, если вы платите за резидентную память, а не за виртуальную.\n\nВыигрыш в том, что паузы переезжают туда, где они бесплатны. Хвост распределения задержек становится заметно ровнее, потому что в горячем пути нет ни маркировки, ни барьеров записи.\n\nРиск в том, что окно простоя может не наступить. Всплеск нагрузки, и память растёт без ограничений. Поэтому такую схему почти всегда страхуют. Либо тем же GOMEMLIMIT как аварийным тормозом, либо явной проверкой порога:\nvar m runtime.MemStats\n\nfunc maybeCollect(limit uint64) {\n runtime.ReadMemStats(&m) // это stop the world, не вызывайте в горячем цикле\n if m.HeapAlloc > limit {\n runtime.GC()\n }\n}\n\nruntime.ReadMemStats сам по себе останавливает мир, так что вызывать его надо по таймеру раз в секунду, а не на каждой итерации.\n\n➡️ Вариант второй, программа без аллокаций\n\nТеоретически самый чистый путь. Если после инициализации программа не аллоцирует в куче вообще, сборщику нечего собирать и GOGC=off безопасен буквально навсегда.\n\nЭто означает выделение всех буферов на старте, переиспользование через sync.Pool или собственные пулы, отказ от fmt в горячем пути, отказ от интерфейсов там, где значение убегает в кучу, работу со срезами фиксированной ёмкости вместо растущего append.\n\nПроверять это надо не на глаз, а инструментами:\ngo build -gcflags='-m' ./... // что именно убегает в кучу\ngo test -bench=. -benchmem // столбец allocs/op должен быть нулевым\n\nИ регрессионный тест, который падает, как только счётчик аллокаций перестал быть нулём:\nfunc TestNoAllocs(t *testing.T) {\n allocs := testing.AllocsPerRun(1000, func() {\n process(input) // горячий путь\n })\n if allocs != 0 {\n t.Fatalf(\"ожидали 0 аллокаций, получили %v\", allocs)\n }\n}\n\nЧестное предупреждение. Держать такое состояние в живом проекте тяжело. Одна безобидная строка логирования, один err.Error() в неудачном месте, и аллокации возвращаются. Обычно так пишут узкое ядро системы, а весь остальной сервис живёт с обычным GC.\n\nКогда всё это оправдано\n\nВыключать сборщик стоит только после измерений. Профиль показывает заметное время в runtime.gcBgMarkWorker, трассировка показывает всплески задержек ровно на циклах сборки, или программа настолько короткоживущая, что сборка просто не успевает окупиться.\nВо всех остальных случаях достаточно поднять GOGC до 200 или 400. Это даёт большую часть выигрыша и не создаёт риска OOM.\n\nДолгоживущая программа с GOGC=off возможна, если вы не оставляете систему без тормозов совсем. GOMEMLIMIT подходит почти всем и не требует менять код. Ручные вызовы runtime.GC() в окнах простоя дают самые ровные задержки, но нуждаются в страховке по памяти. Код без аллокаций работает вечно, но живёт только под постоянным присмотром бенчмарков.\n\n📍 Навигация: Вакансии • Задачи • Собесы\n\n🐸 Библиотека Go-разработчика\n\n#GoDeep","datePublished":"2026-07-15T13:02:16Z","dateModified":"2026-07-15T13:02:16Z","author":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"publisher":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"commentCount":5,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2106},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":20},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7404","url":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7404","mainEntityOfPage":"https://telemetr.io/ru/channels/1465826763-goproglib/posts/7404","headline":"😋 Топ-вакансий для Go-разработчиков за неделю Go-разработчик — от 365 000 ₽, Удаленно (Москва) Golang разрабо…","articleBody":"😋 Топ-вакансий для Go-разработчиков за неделю \n\nGo-разработчик — от 365 000 ₽, Удаленно (Москва)\n\nGolang разработчик — офис в Москве\n\nSenior Backend Engineer — от 450 000 ₽, удаленно (Москва)\n\n➡️ Еще больше топовых вакансий — в нашем канале Go jobs\n\n🐸 Библиотека Go-разработчика\n\n#GoWork","datePublished":"2026-07-15T07:02:30Z","dateModified":"2026-07-15T07:02:30Z","author":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"publisher":{"@type":"Organization","name":"Библиотека Go-разработчика | Golang","url":"https://telemetr.io/ru/channels/1465826763-goproglib","image":"https://img.telemetr.io/c/1Bcsv9/5285275279037683160?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2553},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":2}]}}]}
Посты канала
2
🤢 Чем больше разработчиков в команде начинают пользоваться Claude Code, тем заметнее одна проблема: кодовая база перестаёт в
🤢 Чем больше разработчиков в команде начинают пользоваться Claude Code, тем заметнее одна проблема: кодовая база перестаёт выглядеть как работа одной команды. Где-то есть тесты, где-то их забыли. Где-то агент следует архитектуре проекта, где-то предлагает решение, которое с ней не сочетается. ⚠️ И это не проблема Claude Code. Он просто следует тому контексту, который получает от каждого разработчика. Завтра покажем, как передать AI инженерный контекст команды и не превратить его внедрение в ещё один источник хаоса. 🗓 23 июля, 19:00 МСК Бесплатно. 60 минут доклада + 30 минут вопросов. 🔗 Занять место на вебинаре и разобраться, почему так происходит 🏃‍♀️ Proglib Academy
1 283
3
🔒 Скорость разработки растёт, но вместе с ней появляется новая проблема — кодовая база быстро теряет единый стиль. Ниже — бесплатный вебинар о том, как этого избежать ⚠️
1 408
4
🌐 Движок блога на Go держит 150 RPS на 1/8 ядра Разработчик Мика Уэйд захостил блог на самом слабом бесплатном Oracle VPS. Э
🌐 Движок блога на Go держит 150 RPS на 1/8 ядра Разработчик Мика Уэйд захостил блог на самом слабом бесплатном Oracle VPS. Это 1/8 ядра CPU и 1 ГБ памяти. Чтобы выжать из такого железа максимум, он написал собственный движок на Go. Ниже про то, почему выбрал Go и что показали замеры. ❓ Почему не Python и не Hugo Автор пишет на Python, поэтому первым делом думал про FastAPI или чистый Python. Но на таком тесном сервере критична каждая крупица производительности, а Python по накладным расходам здесь проигрывает. Hugo отмёл из за опасений по памяти. В итоге выбор пал на Go, хотя раньше автор на нём не писал. Решающим стало то, как Go и Python по разному управляют памятью. У Go компактный рантайм и сборщик мусора, который не раздувает потребление на простых нагрузках. Движок собран с нуля. Посты пишутся в Markdown и конвертируются в HTML, примерно как в Hugo. ➡️ Память Голый минимальный Ubuntu с SSH занимал 179 Mi. После запуска приложения через bash скрипт потребление стало даже меньше, 155 Mi. Сам движок настолько лёгкий, что без нагрузки его вклад почти незаметен. ➡️ Нагрузочный тест Автор прогнал трафик от 1 до 1000 RPS, по 60 секунд на ступень, около 4% запросов поисковые. По задержке до 150 RPS ответ стабильно держится около 53 мс. На 300 RPS растёт, но остаётся здоровым. Выше сервер упирается в потолок и начинаются таймауты. По CPU до 150 RPS движок ест меньше 20% одного ядра из двух доступных. Насыщение наступает между 300 и 500 RPS. По памяти самое интересное. Потребление держится ровно на 18–19 МБ при низкой и средней нагрузке. Только на 1000 RPS поднимается примерно до 34 МБ с пиками около 50–60 МБ. Для веб приложения под нагрузкой это очень скромно, и здесь как раз виден компактный рантайм Go. Связка минимального Ubuntu и движка на Go дала стабильные 53 мс и около 18 МБ памяти вплоть до 150 RPS. Хороший аргумент в пользу Go там, где ресурсов почти нет. ➡️ Блог разработчика 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
2 036
5
AvitoTech Go&Grill в СПб уже ЗАВТРА 🔥 22 июля AvitoTech собирает Go-разработчиков на свой фирменный и максимально кайфовый ф
AvitoTech Go&Grill в СПб уже ЗАВТРА 🔥 22 июля AvitoTech собирает Go-разработчиков на свой фирменный и максимально кайфовый формат Go&Grill. Ивент будет в баре «Юнион». В программе никакой корпоративной духоты: — Fast food System Design — в командах соберёте архитектуру для мемного проекта; — Go-бинго; — зона для отдыха, бар и, конечно, вкусная еда с гриля! Ждут Go-разработчиков и тех, кто хочет перейти в Go из другого бэкенд-стрима. Скорее регистрируйтесь, ссылка еще активна! 🤓
2 090
6
📎 Общие неэкспортируемые функции в Go В пакете несколько файлов, и всем нужна одна неэкспортируемая функция. Куда её положить. Файлы внутри пакета не важны Область видимости в Go это пакет, а не файл. Все файлы с одним package foo в одной директории видят функции друг друга, включая приватные. Значит объявляйте общую функцию в любом файле, остальные её увидят без импортов и дублей. Хелперы обычно кладут в файл по смыслу, например parse.go. Свалку utils.go заводить не стоит, держите функции рядом с их сущностью. Если функция нужна нескольким пакетам Когда приватную логику переиспользуют два и более пакета модуля, используйте internal: internal/hashing/hashing.go // общий код api/api.go // импортирует internal/hashing Пакет в директории internal импортируют только пакеты из того же поддерева. Функция экспортируется внутри internal/hashing, но снаружи модуля пакет закрыт. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
2 252
7
😸 Каждый разработчик подходит к задаче со своим опытом: помнит прошлые решения, знает ограничения проекта и понимает, какой
😸 Каждый разработчик подходит к задаче со своим опытом: помнит прошлые решения, знает ограничения проекта и понимает, какой код команда пропустит на ревью. Для человека это естественная часть работы. У Claude Code этого контекста по умолчанию нет — только задача и инструкции, которые ему дали. Поэтому в большой команде недостаточно просто выбрать хорошую модель. ❗️ Нужно ещё объяснить ей, как у вас устроена разработка: какие подходы приняты, что обязательно проверять и по каким правилам принимать решения. 🗓 23 июля в 19:00 МСК поговорим об этом на бесплатном вебинаре с Алексеем Жиряковым — он Executive Director в Сбере, руководит GenAI Data Platform, и с этой проблемой сталкивался не раз 🔥 Покажет живое демо, разберём, как встроить AI в процесс разработки так, чтобы он реально помогал, а не добавлял ещё один повод для споров на ревью. 🔗 Занять место на вебинаре 🏃‍♀️ Proglib Academy
1 844
8
✏️ Если вы уже работаете с Claude Code, Cursor или Copilot, этот вебинар будет особенно полезен. Разберут, как превратить AI из инструмента для отдельных задач в часть инженерного процесса ⬇️
2 077
9
⭐️ Дайджест недели — Go открыт для разработки 1.28 — В Go захотели поддержку GOARM64=v9.6 — Топовые вакансии — Конференция, к
⭐️ Дайджест недели — Go открыт для разработки 1.28 — В Go захотели поддержку GOARM64=v9.6 — Топовые вакансии — Конференция, которая заканчивается концертом 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
2 293
10
🥴 Рынок труда в IT не рухнул из-за ИИ Апокалиптичные прогнозы «нейросети всех уволят» не сбылись. Вместо этого рынок тихо пе
🥴 Рынок труда в IT не рухнул из-за ИИ Апокалиптичные прогнозы «нейросети всех уволят» не сбылись. Вместо этого рынок тихо переписал правила игры: появились новые способы обмануть заказчика, новая инфляция пет-проектов и новая ценность для тех, кто умеет думать головой, а не только генерировать код. ➡️ В статье про «синдром самозванца наоборот» и поляризацию, где топы дорожают, а середина проседает 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 574
11
🧑‍💻 Учиться агентной разработке — у тех, кто уже внедряет её в бигтехе Курс «ИИ для разработчиков» ведут практики из ведущи
🧑‍💻 Учиться агентной разработке — у тех, кто уже внедряет её в бигтехе Курс «ИИ для разработчиков» ведут практики из ведущих российских IT-компаний 🔥 🔵 Они прошли путь от первых экспериментов с AI до рабочих процессов, в которых агенты помогают команде писать код, готовить PR и быстрее доводить задачи до продакшена. В ближайшее время познакомим вас с каждым преподавателем. Программа курса — по ссылке 🎹 🏃‍♀️ Proglib Academy
1 600
12
📍 Курс — это не только темы и домашние задания Во многом его ценность определяет опыт тех, кто его разрабатывает и ведёт. Об этом как раз новый пост Proglib Academy 🔥
2 205
13
🧩 Загадка на внимательность к Go Что тут вернётся? s := "привет" s[0:3] Многие на автомате думают, что получат первые три буквы. Но вспомните: в Go строка — это не последовательность символов, а последовательность байтов. Вот и считайте: срез по трём байтам аккуратно ложится на границы букв? Или где-то посередине что-то обрывается? ➡️ Ответ 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #ReadySetGo
2 573
14
🫡 Один и тот же запрос к AI можно выполнить двумя способами — и получить совершенно разный результат. 1️⃣ способ — просто по
🫡 Один и тот же запрос к AI можно выполнить двумя способами — и получить совершенно разный результат. 1️⃣ способ — просто попросить написать код. Модель может сгенерировать рабочее решение, но именно на этапе проверки часто всплывают пропущенные edge case’ы, ошибки обработки или проблемы с тестами. 2️⃣ способ — дать агенту цикл Think → Act → Observe. Он не останавливается после первой попытки: планирует действия, проверяет результат и, если находит ошибку, исправляет её и пробует снова. Самое интересное, что разница здесь не столько в модели ❕ Claude, GPT или другая LLM могут быть одинаковыми. Разницу создаёт инженерная система вокруг них. 📅 Именно это разберём 23 июля в 19:00 (МСК) на бесплатном вебинаре с Алексеем Жиряковым (Executive Director в Сбере, GenAI Data Platform, ex-CTO Stream и KION). На живом демо покажем, как один и тот же запрос работает без агентной системы и с ней 🔥 🔗 Регистрация 🏃‍♀️ Proglib Academy
1 710
15
🤩 Go открыт для разработки 1.28 Команда Go сообщила о статусе релиза Go 1.27, он скоро уйдёт в релиз, а основная ветка уже о
🤩 Go открыт для разработки 1.28 Команда Go сообщила о статусе релиза Go 1.27, он скоро уйдёт в релиз, а основная ветка уже открыта для общей разработки Go 1.28. Пока идёт стабилизация 1.27. В треде разработчики уже расписали планы на следующую версию. Будут чинить баги корректности компилятора, добавлять инкрементальные оптимизации в regalloc и планировщик, а также убирать рукописный ассемблер в пользу чистого Go. Будут переработаны узкие места масштабируемости сборщика мусора при работе на более чем 256 ядрах и проведут эксперименты с NUMA осведомлённостью Green Tea. ➡️ Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
2 492
16
🛡 Защита от SQL инъекций и XSS в Go Оба типа атак растут из одной ошибки. Мы склеиваем строку из данных пользователя и отдаём её движку, который умеет исполнять код. База данных видит SQL, браузер видит HTML или JavaScript. Данные внезапно становятся командами. Разберём, как этого не допускать на практике, и что спросят на собеседовании. 💉 SQL инъекции Опасный код выглядит так: query := fmt.Sprintf("SELECT id, email FROM users WHERE email = '%s'", email) row := db.QueryRow(query) Если в email придёт ' OR 1=1 --, условие развалится и вернётся вся таблица. Строка форматируется до того, как попадёт в базу, поэтому никакой защиты тут нет. Правильный вариант передаёт значения отдельно от текста запроса: row := db.QueryRowContext(ctx, "SELECT id, email FROM users WHERE email = $1", email) Драйвер отправляет запрос и параметры разными полями протокола. Значение уже не может изменить структуру запроса, потому что база разбирает синтаксис до подстановки данных. Синтаксис плейсхолдера зависит от драйвера, в pgx и lib/pq это $1, в go-sql-driver/mysql это ?. Что нельзя параметризовать Плейсхолдеры работают только для значений. Имя таблицы, имя колонки, направление сортировки так подставить не получится. Здесь помогает белый список: var allowedSort = map[string]string{ "created": "created_at", "email": "email", } column, ok := allowedSort[r.URL.Query().Get("sort")] if !ok { column = "created_at" } query := fmt.Sprintf("SELECT id FROM users ORDER BY %s DESC LIMIT 50", column) Форматирование строки тут безопасно, потому что в column попадает только заранее известное значение из карты, а не пользовательский ввод. Отдельно стоит помнить про IN. Список плейсхолдеров придётся собрать самому: placeholders := make([]string, len(ids)) args := make([]any, len(ids)) for i, id := range ids { placeholders[i] = fmt.Sprintf("$%d", i+1) args[i] = id } query := "SELECT id FROM users WHERE id IN (" + strings.Join(placeholders, ",") + ")" rows, err := db.QueryContext(ctx, query, args...) В pgx проще передать массив через = ANY($1). Билдеры вроде squirrel и ORM вроде gorm подставляют аргументы сами. Но у обоих есть методы для сырых кусков SQL, и туда пользовательский ввод класть нельзя. gorm спасает не сам по себе, а только пока мы не пишем Where(fmt.Sprintf(...)). Дополнительные меры, которые уменьшают ущерб при ошибке. Отдельный пользователь базы с минимальными правами, без DROP и без доступа к чужим схемам. Логи запросов без подстановленных значений. Ограничение на размер входных полей. 🔪 XSS Та же логика, только теперь опасный движок это браузер. Если мы вставим пользовательский текст прямо в HTML, тег <script> из комментария выполнится у всех, кто открыл страницу. Плохо: fmt.Fprintf(w, "<div>Привет, %s</div>", name) Хорошо: tmpl := template.Must(template.New("page").Parse( `<div>Привет, {{ .Name }}</div>`)) tmpl.Execute(w, data) Ключевое отличие в пакете. html/template экранирует данные с учётом контекста, text/template не экранирует ничего. Импорт text/template в веб хендлере это готовая дыра, и на собеседовании про это спрашивают почти всегда. Контекстность означает, что шаблонизатор смотрит, куда именно попадает значение. Внутри тега это HTML экранирование, внутри атрибута другое, внутри href проверка схемы, внутри блока <script> экранирование по правилам JavaScript. Один и тот же {{ .Value }} даст разный вывод: tmpl := template.Must(template.New("x").Parse(` <a href="{{ .URL }}" title="{{ .Title }}">{{ .Title }}</a> <script>var user = {{ .Name }};</script> `)) Строка javascript:alert(1) в href превратится в #ZgotmplZ, то есть ссылка просто не сработает. ➡️ Где защита отключается Типы template.HTML, template.JS, template.URL говорят шаблонизатору доверять содержимому и не трогать его. Это законная возможность, но применять её к данным пользователя нельзя: // так делать нельзя data.Bio = template.HTML(userInput) Если пользователю действительно нужен HTML, например разметка в комментариях, содержимое надо чистить санитайзером: import "github.com/microcosm-cc/bluemonday" p := bluemonday.UGCPolicy() safe := template.HTML(p.Sanitize(userInput)) bluemonday работает по белому списку тегов и атрибутов, всё остальное вырезает. ➡️ API и заголовки Для JSON ответов достаточно encoding/json, он экранирует <, > и & в escape последовательности. Но заголовок ставить обязательно, иначе браузер может угадать тип и отрендерить ответ как HTML. w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("X-Content-Type-Options", "nosniff") json.NewEncoder(w).Encode(resp) Хорошая практика добавить Content-Security-Policy, который запрещает инлайновые скрипты. Он не заменяет экранирование, но снижает шанс, что случайная дыра превратится в кражу сессий. Куки сессии стоит помечать HttpOnly, тогда украденный скрипт до них не доберётся. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
2 250
17
🧑‍💻 В Go захотели поддержку GOARM64=v9.6 В трекере Go появилось предложение №80402. Разработчик просит добавить новое значение переменной GOARM64 со значением v9.6 и тег сборки arm64.v9.6, чтобы тулчейн умел собирать под архитектуру Armv9.6-A. Вместе с версией предлагают включать набор инструкций FEAT_CMPBR автоматически. Он объединяет сравнение и условный переход в одну операцию, в Armv9.6-A обязателен, поэтому отдельная опция не нужна. По умолчанию поведение не меняется, значение пригодится тем, кто собирает под свежие чипы на Armv9.6-A. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
2 594
18
🔥 Курс «Разработка ИИ-агентов» стартовал, но вы еще успеваете присоединиться! Мы только начали, а первый практический воркшо
🔥 Курс «Разработка ИИ-агентов» стартовал, но вы еще успеваете присоединиться! Мы только начали, а первый практический воркшоп пройдет только 23 июля. До этого времени вы спокойно успеете изучить материалы и нагнать группу. 💼 Главная фишка: финальный проект в портфолио: В финальном проекте вы сможете выбрать один из двух вариантов: реализовать свою идею или решить задачу от партнера курса — крупной российской финтех-компании. Вы будете работать с датасетом, построенным по реальным сценариям, получите бизнес-контекст и продовые ограничения. В результате соберете AI-агента, который станет сильным проектом для портфолио. 🎁 Упомяните менеджеру специальное предложение «3 курса по цене 1»: Берете VIP-тариф — получаете курс «Разработка ИИ-агентов», хардкорный «AgentOps» и ещё один курс на выбор. Выгода 129.000 ₽! Двери потока вот-вот закроются окончательно. Успейте забрать стек курсов и начать работу над реальным проектом 🔗 Занять место и забрать 3 курса
2 484
19
⭐️ Пишем долгоживущую программу на Go с GOGC=off. Часть 2, ручной GC и код без аллокаций В первой части мы разобрали связку GOGC=off и GOMEMLIMIT. Она подходит большинству сервисов и не требует переписывать код. Но есть задачи, где даже редкие циклы сборки в неудачный момент неприемлемы. Торговый бот в момент котировки, игровой сервер внутри тика, обработчик, у которого хвостовые задержки важнее среднего времени ответа. Для таких случаев есть два более жёстких варианта. ➡️ Вариант первый, ручные циклы в окнах простоя Идея простая. Вы выключаете автоматический триггер и запускаете сборку сами, но только тогда, когда пауза никому не мешает. Между тиками, между батчами, вне торговой сессии: debug.SetGCPercent(-1) for { batch := queue.Fetch() process(batch) // на этом участке GC не вмешивается if idle() { runtime.GC() debug.FreeOSMemory() // ещё и вернуть память операционной системе } } runtime.GC() выполняет полный цикл синхронно и возвращает управление, когда он закончен. debug.FreeOSMemory() делает то же самое и дополнительно отдаёт освободившиеся страницы ОС, что полезно, если вы платите за резидентную память, а не за виртуальную. Выигрыш в том, что паузы переезжают туда, где они бесплатны. Хвост распределения задержек становится заметно ровнее, потому что в горячем пути нет ни маркировки, ни барьеров записи. Риск в том, что окно простоя может не наступить. Всплеск нагрузки, и память растёт без ограничений. Поэтому такую схему почти всегда страхуют. Либо тем же GOMEMLIMIT как аварийным тормозом, либо явной проверкой порога: var m runtime.MemStats func maybeCollect(limit uint64) { runtime.ReadMemStats(&m) // это stop the world, не вызывайте в горячем цикле if m.HeapAlloc > limit { runtime.GC() } } runtime.ReadMemStats сам по себе останавливает мир, так что вызывать его надо по таймеру раз в секунду, а не на каждой итерации. ➡️ Вариант второй, программа без аллокаций Теоретически самый чистый путь. Если после инициализации программа не аллоцирует в куче вообще, сборщику нечего собирать и GOGC=off безопасен буквально навсегда. Это означает выделение всех буферов на старте, переиспользование через sync.Pool или собственные пулы, отказ от fmt в горячем пути, отказ от интерфейсов там, где значение убегает в кучу, работу со срезами фиксированной ёмкости вместо растущего append. Проверять это надо не на глаз, а инструментами: go build -gcflags='-m' ./... // что именно убегает в кучу go test -bench=. -benchmem // столбец allocs/op должен быть нулевым И регрессионный тест, который падает, как только счётчик аллокаций перестал быть нулём: func TestNoAllocs(t *testing.T) { allocs := testing.AllocsPerRun(1000, func() { process(input) // горячий путь }) if allocs != 0 { t.Fatalf("ожидали 0 аллокаций, получили %v", allocs) } } Честное предупреждение. Держать такое состояние в живом проекте тяжело. Одна безобидная строка логирования, один err.Error() в неудачном месте, и аллокации возвращаются. Обычно так пишут узкое ядро системы, а весь остальной сервис живёт с обычным GC. Когда всё это оправдано Выключать сборщик стоит только после измерений. Профиль показывает заметное время в runtime.gcBgMarkWorker, трассировка показывает всплески задержек ровно на циклах сборки, или программа настолько короткоживущая, что сборка просто не успевает окупиться. Во всех остальных случаях достаточно поднять GOGC до 200 или 400. Это даёт большую часть выигрыша и не создаёт риска OOM. Долгоживущая программа с GOGC=off возможна, если вы не оставляете систему без тормозов совсем. GOMEMLIMIT подходит почти всем и не требует менять код. Ручные вызовы runtime.GC() в окнах простоя дают самые ровные задержки, но нуждаются в страховке по памяти. Код без аллокаций работает вечно, но живёт только под постоянным присмотром бенчмарков. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
2 106
20
😋 Топ-вакансий для Go-разработчиков за неделю Go-разработчик — от 365 000 ₽, Удаленно (Москва) Golang разработчик — офис в Москве Senior Backend Engineer — от 450 000 ₽, удаленно (Москва) ➡️ Еще больше топовых вакансий — в нашем канале Go jobs 🐸 Библиотека Go-разработчика #GoWork
2 553