ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

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

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

الذهاب إلى القناة على Telegram

Все самое полезное для 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) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.

23 970
المشتركون
-1124 ساعات
-677 أيام
-10330 أيام
جذب المشتركين
أكتوبر '26
أكتوبر '26
+154
في 7 قنوات
سبتمبر '26
+198
في 0 قنوات
Get PRO
أغسطس '26
+260
في 1 قنوات
Get PRO
يوليو '26
+221
في 2 قنوات
Get PRO
يونيو '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 قنوات
التاريخ
نمو المشتركين
الإشارات
القنوات
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
منشورات القناة
Burst — не число одновременно работающих запросов rate.NewLimiter(r, b) из golang.org/x/time/rate создаёт полную корзину на b
Burst — не число одновременно работающих запросов 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 тормозит? Сначала посмотрите на очередь пула sql.DB — пул соединений. Когда достигнут SetMaxOpenConns, следующая операция ждёт свободное соединение, ещё не выполняя SQL. У db.Stats() есть InUse, Idle и накопительные WaitCount, WaitDuration. Сравните счётчики в начале и конце интервала: растут ли ожидания вместе с задержкой сервиса? Это время ожидания соединения, а не выполнения запроса в БД. Не повышайте лимит вслепую. Учитывайте возможности БД и число реплик сервиса. SetMaxIdleConns управляет оставленными свободными соединениями, а не общим потолком. Управление пулом 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 061
4
Тело запроса слишком большое. Не маскируйте это под EOF io.LimitReader прекращает чтение на лимите, как будто данные закончил
Тело запроса слишком большое. Не маскируйте это под 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 действует акция: покупаешь один кур
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше. В 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 оказалось недостаточно. Команда
💾 Команда Dolt ускорила WAL сочетанием fdatasync и записи нулей Заменить fsync на fdatasync оказалось недостаточно. Команда Go-базы Dolt также стала заранее записывать 4 МиБ нулей при расширении журнала. Следующие записи перезаписывают готовую область, реже требуя синхронизации метаданных. Во внутренних тестах небольших последовательных записей это дало 10–40% прироста. Помогло сочетание Ext4 и сетевого диска с заметной задержкой, но свободной пропускной способностью. На Btrfs и OpenZFS такого выигрыша не увидели. А предварительная запись нулей увеличивает объём записи — вплоть до двух раз. При упоре в пропускную способность оптимизация может навредить. Полезный разбор для тех, кто пишет хранилища и журналы на Go. На дату статьи изменение было в main, но ещё не вошло в релиз Dolt. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 893
11
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция! До 31 октября в Proglib Academy можно выбрать два курса
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция! До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один. Например, можно совместить: 💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений. Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥 Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога. Акция действует до 31 октября включительно ⏳ ⏬ Собрать свой учебный билд
2 835
12
⚙️ Go 1.27 открывает SIMD-инструкции ARM и WebAssembly без ассемблера Переносимый SIMD скрывает различия процессоров. Но для
⚙️ 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 спрашивает, какие теги добавить полям структуры Раньше действие 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.2
🌐 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. Клиент присылает Connec
🔎 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 запускает и код зависимостей Загрузка Go-модуля не выполняет его init(). Но когда зависимость импортирована в тестовый бинарник, её инициализация запускается до тестов — с доступом к окружению процесса. Жюль Робино проверил это на собственной тестовой зависимости: при сборке она молчала, а во время go test её init() прочитал переменные окружения. 🔴 Если тестовый job получает ключ деплоя, импортированная зависимость тоже может к нему обратиться. Автор предлагает разделять тесты и публикацию, выдавая каждому job только нужные полномочия. Проверять стоит и новые зависимости. govulncheck ищет известные уязвимости, а capslock показывает возможности кода и пути вызовов: доступ к сети, файлам, запуск процессов. Неожиданная возможность — повод изучить её использование. Контрольная сумма подтверждает целостность модуля, но сама по себе не доказывает безопасность его поведения. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
3 735
17
🧪 Зелёный тест ещё нужно проверить Функция IsSorted должна отличать отсортированный слайс от неотсортированного. Один тест н
🧪 Зелёный тест ещё нужно проверить Функция IsSorted должна отличать отсортированный слайс от неотсортированного. Один тест на [1, 2, 3] пропустит реализацию, которая всегда возвращает true. В разборе TDD на Go Джон Арундел сначала пишет тест и минимальную реализацию с return false. Тест компилируется и падает: теперь видно, что он реагирует на эту ошибку. Затем автор добавляет неотсортированный вход и постепенно расширяет набор случаев. Повторяющиеся числа проверяют допустимость равных соседей, отрицательные — ошибочную начальную границу, пустой слайс — обращение к несуществующему элементу. 🔴 Каждый найденный баг сначала получает падающий тест, затем исправление. Зелёный прогон показывает соответствие проверенным случаям; полноту набора нужно оценивать отдельно. Самописная IsSorted здесь служит упражнением по TDD. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
3 608
18
💡 slog: убираем секретный атрибут до записи лога Токен не должен попадать в лог, но приходит вместе с остальными полями запр
💡 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, в тест можно передать fstes
🧪 Тестируем файловый код без временных каталогов Функция читает файлы? Если она принимает fs.FS, в тест можно передать fstest.MapFS: пути и содержимое задаются прямо в map. Родительские каталоги создаются в этой модели автоматически. В примере на карточке два файла. banner.txt читается как hello, а отсутствующий путь возвращает ошибку, которую можно проверить через errors.Is(err, fs.ErrNotExist). fstest.TestFS проверяет поведение файловой системы и наличие перечисленных файлов. Содержимое и логику вашей функции нужно проверять отдельно. 🔴 Не меняйте map одновременно с файловыми операциями: это data race. Для большой файловой системы такая модель неудобна — обход каталогов перебирает всю map. ➡️ MapFS и TestFS в документации 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
3 753