Библиотека Go-разработчика | Golang
Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 Заявка: 8137752389
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Библиотека Go-разработчика | Golang
تُعد قناة Библиотека Go-разработчика | Golang (@goproglib) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 23 970 مشتركاً، محتلاً المرتبة 5 523 في فئة التكنولوجيات والتطبيقات والمرتبة 27 298 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 23 970 مشتركاً.
بحسب آخر البيانات بتاريخ 29 أكتوبر, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -103، وفي آخر 24 ساعة بمقدار -11، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 14.82%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 7.41% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 3 553 مشاهدة. وخلال اليوم الأول يجمع عادةً 1 777 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 4.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل навигация, лучшее_из_библиотеки_2025, git, string, golive.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Все самое полезное для Go-разработчика в одном канале.
Учиться у нас: clc.to/qaSdww
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0
Заявка: 8137752389”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 30 أكتوبر, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
جارٍ تحميل البيانات
| التاريخ | نمو المشتركين | الإشارات | القنوات | |
| 30 أكتوبر | 0 | |||
| 29 أكتوبر | +3 | |||
| 28 أكتوبر | +3 | |||
| 27 أكتوبر | +5 | |||
| 26 أكتوبر | +1 | |||
| 25 أكتوبر | +1 | |||
| 24 أكتوبر | +3 | |||
| 23 أكتوبر | +2 | |||
| 22 أكتوبر | +8 | |||
| 21 أكتوبر | +5 | |||
| 20 أكتوبر | +3 | |||
| 19 أكتوبر | +5 | |||
| 18 أكتوبر | +3 | |||
| 17 أكتوبر | +6 | |||
| 16 أكتوبر | +5 | |||
| 15 أكتوبر | +2 | |||
| 14 أكتوبر | +10 | |||
| 13 أكتوبر | +8 | |||
| 12 أكتوبر | +13 | |||
| 11 أكتوبر | +11 | |||
| 10 أكتوبر | +7 | |||
| 09 أكتوبر | +8 | |||
| 08 أكتوبر | +4 | |||
| 07 أكتوبر | +2 | |||
| 06 أكتوبر | +12 | |||
| 05 أكتوبر | +6 | |||
| 04 أكتوبر | +6 | |||
| 03 أكتوبر | +3 | |||
| 02 أكتوبر | +5 | |||
| 01 أكتوبر | +4 |
rate.NewLimiter(r, b) из golang.org/x/time/rate создаёт полную корзину на b токенов. Она пополняется со скоростью r токенов в секунду. Начальный запас разрешает короткий всплеск.
Allow() сразу откажет, если токена нет. Wait(ctx) подождёт, учитывая отмену и дедлайн. Для общего бюджета используйте общий экземпляр лимитера, а не новый в каждом обработчике.
Долгие операции всё равно могут выполняться параллельно. Число занятых горутин ограничивайте отдельно. Между репликами сервиса этот лимитер состояние не делит.
Документация rate
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика| 2 | Конфиг должен быть старым или новым, а не записанным наполовину
Прямая перезапись файла может показать читателю неполные данные. github.com/google/renameio/v2 решает другую задачу: атомарно заменяет файл подготовленной версией.
renameio.WriteFile берёт на себя временный файл, корректную замену и уборку при ошибке. Читатель не должен увидеть промежуточное содержимое.
Но атомарность не равна сохранности после отключения питания: durability пакет не обещает. На Windows он не экспортирует функций. А права в v2 учитывают umask процесса.
README и ограничения renameio
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 1 575 |
| 3 | SQL тормозит? Сначала посмотрите на очередь пула
sql.DB — пул соединений. Когда достигнут SetMaxOpenConns, следующая операция ждёт свободное соединение, ещё не выполняя SQL.
У db.Stats() есть InUse, Idle и накопительные WaitCount, WaitDuration. Сравните счётчики в начале и конце интервала: растут ли ожидания вместе с задержкой сервиса? Это время ожидания соединения, а не выполнения запроса в БД.
Не повышайте лимит вслепую. Учитывайте возможности БД и число реплик сервиса. SetMaxIdleConns управляет оставленными свободными соединениями, а не общим потолком.
Управление пулом
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 061 |
| 4 | Тело запроса слишком большое. Не маскируйте это под EOF
io.LimitReader прекращает чтение на лимите, как будто данные закончились. Для входящего HTTP-body есть http.MaxBytesReader(w, r.Body, n): попытка прочитать сверх лимита возвращает *http.MaxBytesError.
Оберните r.Body до чтения. Превышение проверяется именно при чтении, а не при создании обёртки. Один json.Decoder.Decode может оставить хвост непрочитанным.
Обработчик сам распознаёт ошибку и выбирает ответ 413. Лимит байтов не заменяет таймаут чтения.
Документация MaxBytesReader
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 352 |
| 5 | Динозавр держится за ВМ и снапшоты по расписанию, Археолог давно не помнит, что и где у него крутится, а Повелителю облаков уютно до первого кругленького счёта. Это три из десяти типов инфраструктуры в тесте от команды Deckhouse.
Ответьте на 5 вопросов, узнайте свой тип и отправьте ссылку на результат команде. Посмотрим, совпадёт ли он у коллег.
→ Пройти тест и узнать свой тип | 2 586 |
| 6 | Fuzzing нашёл ошибку. Сохраните вход вместе с исправлением
Обычный go test запускает fuzz-тест на исходном корпусе: входах из f.Add и файлов testdata/fuzz. Новые входы в этом режиме не генерируются. Активный поиск нужно включить отдельно.
Если в пакете один fuzz-тест, короткий запуск выглядит так:
go test -fuzz=. -fuzztime=10s
Если их несколько, вместо точки задайте регулярное выражение, которое выбирает ровно один. Движок меняет входы и использует покрытие кода, чтобы находить новые пути выполнения. Но проверяемое свойство задаёт автор теста. Например, после кодирования и обратного декодирования должны получиться исходные данные.
При сбое Go пытается уменьшить вход, сохранив ошибку, и записывает его в подкаталог testdata/fuzz с именем теста. Путь и команду точечного повторного запуска он выводит в терминал.
После исправления запустите go test и добавьте найденный файл в репозиторий вместе с кодом. Этот вход станет регрессионной проверкой и будет выполняться без нового fuzzing-запуска. А вот интересные входы из кеша $GOCACHE/fuzz используются только при активном поиске.
Десять секунд без падений не доказывают отсутствие ошибок. Сам fuzz-target должен быть быстрым, детерминированным и не зависеть от изменяемого глобального состояния.
Как Go хранит корпус и воспроизводит сбои
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 619 |
| 7 | 📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.
💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно ⏳
⏮️ Пора прокачать свой стек | 2 522 |
| 8 | Тест упал. Покажите, что именно разошлось
Два больших объекта в логе приходится сравнивать глазами. cmp.Diff(want, got) из go-cmp показывает различия, в том числе во вложенных структурах. Пустая строка означает, что значения равны по выбранным правилам.
Мини-пример для файла tags_test.go. Здесь разные вторые элементы, поэтому тест намеренно падает:
package example
import (
"testing"
"github.com/google/go-cmp/cmp"
)
func TestTags(t *testing.T) {
want := []string{"go", "sql"}
got := []string{"go", "http"}
diff := cmp.Diff(want, got)
if diff != "" {
t.Errorf("tags mismatch (-want +got):\n%s", diff)
}
}
При таком порядке аргументов строки с - относятся к ожидаемому значению, с + — к полученному. Сам формат diff нестабилен: он для чтения человеком, а не для парсинга.
Правила равенства тоже часть теста. По умолчанию nil и пустой слайс различаются. Опция cmpopts.EquateEmpty() уравнивает слайсы и map нулевой длины, но добавлять её стоит только тогда, когда API действительно не различает эти состояния. Неэкспортируемые поля без подходящего правила сравнения могут вызвать панику.
cmp.Diff • EquateEmpty
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 486 |
| 9 | singleflight: один запрос к источнику вместо одинаковых параллельных
Кеш опустел, и несколько обработчиков одновременно пошли за одним товаром в БД. Пока первый запрос ещё работает, остальные повторяют ту же работу. Для такой ситуации есть golang.org/x/sync/singleflight.
Вызов Group.Do(key, fn) объединяет обращения с одинаковым ключом: выполняется одна функция, остальные ждут и получают её результат вместе с ошибкой. Ключи разные — работа идёт независимо. Все обработчики должны использовать одну и ту же Group, а не создавать её заново на каждый запрос.
Ключ описывает всё, от чего зависит результат. Если данные различаются между арендаторами, одного ID товара мало. Например, tenant:42:product:7 отделяет его от такого же товара другого арендатора.
Готовый результат singleflight не хранит: следующий вызов после завершения работы снова запустит функцию. Механизм действует внутри одного процесса и не ограничивает общее число запросов по разным ключам. А флаг shared сообщает, что результат получили несколько вызовов, а не что сработал кеш.
Документация singleflight
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 716 |
| 10 | 💾 Команда Dolt ускорила WAL сочетанием fdatasync и записи нулей
Заменить fsync на fdatasync оказалось недостаточно. Команда Go-базы Dolt также стала заранее записывать 4 МиБ нулей при расширении журнала. Следующие записи перезаписывают готовую область, реже требуя синхронизации метаданных.
Во внутренних тестах небольших последовательных записей это дало 10–40% прироста. Помогло сочетание Ext4 и сетевого диска с заметной задержкой, но свободной пропускной способностью.
На Btrfs и OpenZFS такого выигрыша не увидели. А предварительная запись нулей увеличивает объём записи — вплоть до двух раз. При упоре в пропускную способность оптимизация может навредить.
Полезный разбор для тех, кто пишет хранилища и журналы на Go. На дату статьи изменение было в main, но ещё не вошло в релиз Dolt.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 893 |
| 11 | 😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция!
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.
💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥
Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.
Акция действует до 31 октября включительно ⏳
⏬ Собрать свой учебный билд | 2 835 |
| 12 | ⚙️ Go 1.27 открывает SIMD-инструкции ARM и WebAssembly без ассемблера
Переносимый SIMD скрывает различия процессоров. Но для специфических операций есть более низкий уровень — экспериментальный simd/archsimd.
В Go 1.27 к amd64 добавились arm64 и wasm. Эксперимент включается при сборке:
GOEXPERIMENT=simd go build
При переносе алгоритма важны крайние случаи. Например, PermuteOrZero на amd64 и LookupOrZero на ARM/wasm по-разному обрабатывают индексы вне диапазона. Поэтому похожие операции получили разные имена.
Это инструмент для измеренных горячих участков: обработки байтов, чисел и векторов. Проверки доступности инструкций и запасной путь остаются частью реализации. API экспериментальный; обычные циклы от включения флага автоматически не векторизуются.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 2 948 |
| 13 | 🛠 gopls спрашивает, какие теги добавить полям структуры
Раньше действие Add struct tags добавляло json-теги в camelCase. Теперь gopls умеет уточнять параметры: например, выбрать json,yaml,db и snake_case.
Ставите курсор на структуру, вызываете действие, отвечаете на два вопроса — сервер генерирует теги для её полей. При удалении тоже можно выбрать конкретные ключи, сохранив остальные.
Для интерактивной работы команда рекомендует gopls 0.24.0 и Go-расширение VS Code 0.56.0. Одного обновления сервера недостаточно: редактор должен поддерживать новые диалоги.
В статье показаны и другие сценарии, но их статус различается. Перенос объявлений демонстрируется как preview, а изменение сигнатуры пока в планах. Проверяйте доступность нужного действия, прежде чем рассчитывать на него в рабочем процессе.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 156 |
| 14 | 🌐 Go 1.27: закрыли Body — соединение ещё пригодится
Клиенту нужен только статус ответа, поэтому тело он не читает. До Go 1.26 включительно вызов resp.Body.Close() в таком HTTP/1-запросе приводил к закрытию соединения. Следующий запрос снова платил за TCP и TLS.
В Go 1.27 Transport после Close асинхронно дочитывает ненужное тело: не более 256 КиБ и не дольше 50 мс. Если успеет, соединение можно использовать повторно. При Connection: close дочитывание пропускается.
🔴 Даже успешный JSON Decode не всегда читает тело до конца: после объекта может остаться перевод строки. Для HTTP/1 это тоже мешало повторному использованию соединения.
Команда Go теперь рекомендует просто закрывать Body, когда оно больше не нужно. Повторное использование не гарантируется: действуют лимиты дочитывания и условия соединения. HTTP/2 использует отдельные потоки, поэтому такого дочитывания не требует.
➡️ Как это устроено в net/http
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 682 |
| 15 | 🔎 ReverseProxy: заголовок добавили, а backend его не увидел
Прокси записывает X-App-User в Director. Клиент присылает Connection: X-App-User — и до backend заголовок уже не доходит.
Причина в порядке обработки: hop-by-hop заголовки удаляются после вызова Director. Клиент может перечислить их в Connection, включая поле, которое добавил сам прокси.
С Rewrite порядок другой: сначала очистка, затем callback. Добавленный в r.Out.Header заголовок сохраняется. Менять входящий r.In нельзя.
В локальном тесте backend получил пустую строку с Director и proxy-user с Rewrite. Оба сценария — на Go 1.27.2. В текущей документации Director помечен устаревшим, для нового кода рекомендуется Rewrite.
➡️ Порядок обработки ReverseProxy
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 764 |
| 16 | 🔎 go test запускает и код зависимостей
Загрузка Go-модуля не выполняет его init(). Но когда зависимость импортирована в тестовый бинарник, её инициализация запускается до тестов — с доступом к окружению процесса.
Жюль Робино проверил это на собственной тестовой зависимости: при сборке она молчала, а во время go test её init() прочитал переменные окружения.
🔴 Если тестовый job получает ключ деплоя, импортированная зависимость тоже может к нему обратиться. Автор предлагает разделять тесты и публикацию, выдавая каждому job только нужные полномочия.
Проверять стоит и новые зависимости. govulncheck ищет известные уязвимости, а capslock показывает возможности кода и пути вызовов: доступ к сети, файлам, запуск процессов. Неожиданная возможность — повод изучить её использование.
Контрольная сумма подтверждает целостность модуля, но сама по себе не доказывает безопасность его поведения.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 735 |
| 17 | 🧪 Зелёный тест ещё нужно проверить
Функция IsSorted должна отличать отсортированный слайс от неотсортированного. Один тест на [1, 2, 3] пропустит реализацию, которая всегда возвращает true.
В разборе TDD на Go Джон Арундел сначала пишет тест и минимальную реализацию с return false. Тест компилируется и падает: теперь видно, что он реагирует на эту ошибку.
Затем автор добавляет неотсортированный вход и постепенно расширяет набор случаев. Повторяющиеся числа проверяют допустимость равных соседей, отрицательные — ошибочную начальную границу, пустой слайс — обращение к несуществующему элементу.
🔴 Каждый найденный баг сначала получает падающий тест, затем исправление. Зелёный прогон показывает соответствие проверенным случаям; полноту набора нужно оценивать отдельно.
Самописная IsSorted здесь служит упражнением по TDD.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 608 |
| 18 | 💡 slog: убираем секретный атрибут до записи лога
Токен не должен попадать в лог, но приходит вместе с остальными полями запроса. У стандартных JSONHandler и TextHandler есть HandlerOptions.ReplaceAttr: callback преобразует атрибут перед записью.
Возврат пустого slog.Attr{} удаляет поле. Фильтр на карточке убирает access_token и внутри группы auth, сохраняя соседний user. Названия открытых групп доступны в аргументе groups.
🔴 Этот пример проверяет имя ключа. Если секрет уже вставлен в текст сообщения, например token=demo-secret, он останется в msg. Передавайте чувствительные данные отдельными атрибутами и продумывайте фильтр для своей схемы логов.
➡️ Документация ReplaceAttr
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 743 |
| 19 | 🧑💻 Какие навыки помогают вам в разработке в 2026 году?
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос | 2 944 |
| 20 | 🧪 Тестируем файловый код без временных каталогов
Функция читает файлы? Если она принимает fs.FS, в тест можно передать fstest.MapFS: пути и содержимое задаются прямо в map. Родительские каталоги создаются в этой модели автоматически.
В примере на карточке два файла. banner.txt читается как hello, а отсутствующий путь возвращает ошибку, которую можно проверить через errors.Is(err, fs.ErrNotExist).
fstest.TestFS проверяет поведение файловой системы и наличие перечисленных файлов. Содержимое и логику вашей функции нужно проверять отдельно.
🔴 Не меняйте map одновременно с файловыми операциями: это data race. Для большой файловой системы такая модель неудобна — обход каталогов перебирает всю map.
➡️ MapFS и TestFS в документации
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика | 3 753 |
