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

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

رفتن به کانال در Telegram

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

نمایش بیشتر

📈 تحلیل کانال تلگرام Библиотека Go-разработчика | Golang

کانال Библиотека Go-разработчика | Golang (@goproglib) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 24 066 مشترک است و جایگاه 5 372 را در دسته فناوری و برنامه‌ها و رتبه 27 097 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 24 066 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 15 سپتامبر, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 28 و در ۲۴ ساعت گذشته برابر -8 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 17.78% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 8.44% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 4 278 بازدید دریافت می‌کند. در اولین روز معمولاً 2 031 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 16 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند навигация, лучшее_из_библиотеки_2025, git, string, golive تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 #WXSSA

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 16 سپتامبر, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

24 066
مشترکین
-824 ساعت
+27 روز
+2830 روز
جذب مشترکین
سپتامبر '26
سپتامبر '26
+110
در 0 کانال‌ها
اوت '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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
16 سپتامبر+3
15 سپتامبر+3
14 سپتامبر+3
13 سپتامبر+5
12 سپتامبر+5
11 سپتامبر+7
10 سپتامبر+16
09 سپتامبر+12
08 سپتامبر+7
07 سپتامبر+6
06 سپتامبر+4
05 سپتامبر+3
04 سپتامبر+8
03 سپتامبر+15
02 سپتامبر+6
01 سپتامبر+7
پست‌های کانال
🔴 Тестовый собес с Go Senior с опытом работы в Ozon, ex. Ситидрайв в этот четверг [+ разбор 50 сложных вопросов в подарок ]
🔴 Тестовый собес с Go Senior с опытом работы в Ozon, ex. Ситидрайв в этот четверг [+ разбор 50 сложных вопросов в подарок ] 17 сентября (в этот четверг!) в 19:00 по МСК приходи онлайн, чтобы посмотреть на настоящее интервью на Middle Go-разработчика! Собеседование проведёт Даниил Динько - Senior Backend Engineer, ex. TechLead tier-3 world cybercrime, ex. Senior Go в Ozon, ex. Ситидрайв. Как это будет: 📂 Даниил задаст разработчику вопросы и задачи, которые могут спросить на реальном собесе; 📂 После каждого ответа респондента ты услышишь подробный комментарий от ментора и поймёшь, чего на самом деле ожидает собеседующий на интервью; 📂 В конце сможешь задать любой вопрос Даниилу и получить на него развёрнутый ответ; Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. И ты можешь посмотреть его бесплатно 🔥 Только завтра, в прямом эфире! 🎁 Подарок для всех, кто зарегается на веб — файл с ОТВЕТАМИ НА 50 СЛОЖНЫХ ВОПРОСОВ с Go-собеседований 🔥 Переходи в бот, чтобы попасть на эфир и забрать подарок 👉 @shortcut_go_bot Реклама. О рекламодателе.

2
🔥 Шейдеры на Go: как оживить игру с помощью кода В Ebitengine шейдеры пишутся на Kage — языке с Go-подобным синтаксисом. С и
🔥 Шейдеры на Go: как оживить игру с помощью кода В Ebitengine шейдеры пишутся на Kage — языке с Go-подобным синтаксисом. С их помощью можно создавать эффекты прямо на уровне пикселей: — маска повреждений зданий; — «дрожащий» рукописный текст; — ретро-CRT и глитчи; — зацикленная анимация текстур; — эффект строительства зданий. ➡️ В статье — практические примеры из игр Roboden и Decipherism, а также разбор Fragment(), текстур, uniform-параметров и DrawRectShader(). 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
2 309
3
😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как тратить меньше на AI-агентов — без потер
😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода. 🔘 Поговорим о том: — когда дорогая модель действительно нужна, а когда хватит дешёвой; — сколько стоит один прогон и куда уходят токены; — какие задачи можно отдавать субагентам; — как настроить маршрутизацию моделей; — что проверять в AI-коде перед merge. ✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после. ⬇️ 18 сентября, 19:00 МСК ⬇️ 1,5 часа · бесплатно ⬇️ Арсений Харланов и Олег Лайок 💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре. 🔗 Зарегистрироваться на вебинар⁠
2 446
4
📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 414
5
🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — числа выведутся по порядку 🔥 — числа выведутся в случайном поряд
🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — числа выведутся по порядку 🔥 — числа выведутся в случайном порядке 👍 — программа завершится с ошибкой 👇 Правильный ответ (нажми, чтобы прочитать): 🔥 — числа выведутся в случайном порядке Каждая итерация запускает отдельную горутину. Значение val передаётся в функцию аргументом v, поэтому все горутины получают правильное число. Но порядок выполнения горутин не гарантирован планировщиком Go. Поэтому вывод может быть, например: 30 10 50 20 40 sync.WaitGroup нужен, чтобы дождаться завершения всех горутин. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 500
6
Вы вообще видели, что сделала команда AvitoTech ко Дню разработчика?! В честь наступающего праздника вместе со студией FU2RE
Вы вообще видели, что сделала команда AvitoTech ко Дню разработчика?! В честь наступающего праздника вместе со студией FU2RE и 3D-художником Dmitriev Video ребята создали большой портал в прошлое — эмулятор 2006 года будущего разработчика. Внутри — олдскульные игры и викторины, за которые можно лутать баллы и подниматься в рейтинге. Топ-3 игроков 15 сентября получат суперпак настоящих разрабов, внутри которого салфетка на монитор из коллаборации с Elnik, плед, сумка и плюшевый талисман — кот Б/У. Так что времени сыграть ещё много! P. S. А ещё в канале AvitoTech до 13 сентября будут каждый день выходить крутые праздничные посты. Не пропустите: может быть, и там они спрятали подарки ❤️
2 560
7
🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy вырастут на 20% 👀 Так что если курс да
🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy вырастут на 20% 👀 Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц 😏 📍 Выбрать курс
2 528
8
👎 Почему context.Value портит код Идея положить данные в контекст и достать их через пару вызовов глубже звучит привлекательно. Код чище, сигнатуры функций не разрастаются, промежуточные уровни не знают о деталях. Но именно в этом и проблема context.Value превращается в чёрный ящик, ломает типобезопасность и делает важные зависимости невидимыми. Паттерн «A положил payment в контекст, C его вытащил, а B просто прокинул ctx дальше» выглядит аккуратно, пока вы помните все неочевидные места чтения. Через неделю уже не видно, какие функции реально зависят от payment а это критические бизнес данные, спрятанные в контейнер без гарантий на уровне компилятора. Любая ошибка в ключе, типе или месте, где забыли вызвать WithValue, всплывает только в рантайме, иногда в виде тихих багов, а не паники. Как обычно делают с context.Value: type Payment struct { ID string Amount int } func A(ctx context.Context, transactionID string) { payment := dbGetPayment(ctx, transactionID) // Кладём бизнес данные в контекст ctx = context.WithValue(ctx, "payment", payment) B(ctx) } func B(ctx context.Context) { // Эта функция формально не знает про payment, // но обязана протащить ctx дальше doSomething(ctx) C(ctx) } func C(ctx context.Context) { // Где то глубоко в стеке достаем payment из «чёрного ящика» payment, ok := ctx.Value("payment").(Payment) if !ok { log.Println("payment not found in context") return } processPayment(payment) } context.Value стоит оставлять для узкого набора метаданных, а важные доменные данные лучше передавать явно через параметры. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
2 474
9
С днем программиста, коллеги! Желаем, чтобы код компилировался с первого раза, баги находились до релиза, а таски «на пять ми
С днем программиста, коллеги! Желаем, чтобы код компилировался с первого раза, баги находились до релиза, а таски «на пять минут» действительно занимали пять минут.  И конечно, пусть в жизни будет больше приятных сюрпризов — один из них мы уже подготовили. Скорее переходите по ссылке, трясите коробку и забирайте свой подарок ко Дню программиста: https://tprg.ru/I45e
2 495
10
💡 Тестирование ввода из stdin Тестирование функций, которые читают данные с консоли через fmt.Scan и stdin в Go, часто становится настоящей задачей. В таких случаях нельзя просто передать параметры функции — код напрямую взаимодействует со стандартным вводом. Пример проблемы: func ReadName() string { var name string fmt.Print("Enter your name: ") fmt.Scan(&name) return name } Для этой функции сложно написать unit-тест, потому что она читает из os.Stdin, а в тестах обычно хочется подставлять свои данные. Решение: подменяем os.Stdin В тестах можно временно переназначить os.Stdin на чтение из заранее подготовленного буфера: func TestReadName(t *testing.T) { input := "Alice\n" r, w, _ := os.Pipe() w.WriteString(input) w.Close() oldStdin := os.Stdin defer func() { os.Stdin = oldStdin }() os.Stdin = r got := ReadName() want := "Alice" if got != want { t.Errorf("got %q, want %q", got, want) } } Функция, вызываемая в тесте, читает данные не из консоли пользователя, а из потока, в который записывают необходимые строки. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 658
11
🌞 Готовим вебинар про AI в разработке и хотим сделать его максимально полезным Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить? 🤩 Пишите вопросы в комментариях — самые залайканные разберём на вебинаре в первую очередь. Задавайте всё, что давно хотелось спросить 📍 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
2 638
12
👩‍💻 15 вопросов по PostgreSQL, которые стоит знать Go-разработчику Если идёте на Middle Go, одного синтаксиса SQL мало. На собеседовании легко уйти в индексы, транзакции и конкурентный доступ. Сохраняйте чек-лист: B-tree — когда используется и какие запросы ускоряет? EXPLAIN ANALYZE — что показывает и чем отличается от EXPLAIN? Почему PostgreSQL выбирает Seq Scan, хотя есть индекс? Составной индекс — что это и зачем нужен? Левый префикс — почему порядок колонок в индексе важен? Как выбрать порядок колонок в составном индексе? MVCC — как PostgreSQL позволяет транзакциям работать параллельно? Уровни изоляции — какие бывают и чем отличаются? Deadlock — как возникает и как его предотвращать? SELECT ... FOR UPDATE — когда нужен? N+1 — откуда появляется и как его найти? ACID — что означает каждая буква на практике? Connection pool — зачем он нужен и какие проблемы возникают при неправильных настройках? Replication lag — почему реплика отстаёт и чем это опасно? Partitioning vs Sharding — в чём разница и когда применять каждый подход? 🔥 Если можете не просто дать определение, а привести пример из реального сервиса на Go, скорее всего, с базовыми вопросами PostgreSQL на собеседовании проблем не будет. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
3 156
13
🔄 Можно ли в Kafka перечитать сообщения? Да. Пока сообщение не удалено по retention, consumer может вернуться к старому offs
🔄 Можно ли в Kafka перечитать сообщения? Да. Пока сообщение не удалено по retention, consumer может вернуться к старому offset и обработать его снова. 🔴 Это особенно полезно, если в обработчике обнаружили баг: исправили код → сдвинули offset назад → переиграли сообщения Например, для consumer group можно сбросить offset через kafka-consumer-groups. 💡 Важно: offset хранится для consumer group, поэтому сброс влияет на чтение этой группой. Kafka в этом плане отличается от классической очереди: прочитанное сообщение не исчезает сразу — его можно переиграть. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
4 117
14
🤔 Вопрос с собеседования Что произойдёт, если одна горутина надолго зациклится на CPU и не будет делать ни sleep, ни syscall
🤔 Вопрос с собеседования Что произойдёт, если одна горутина надолго зациклится на CPU и не будет делать ни sleep, ни syscall, ни операций с каналами? ❤️ — вторая горутина не выполнится, потому что P всего один 🔥 — планировщик вытеснит первую горутину и запустит вторую 👍 — вторая выполнится только после runtime.Gosched() 👇 Правильный ответ (нажми, чтобы прочитать): 🔥 Начиная с Go 1.14 планировщик поддерживает асинхронное вытеснение. Поэтому даже CPU-bound горутина, которая не блокируется и не вызывает runtime-функции, не может бесконечно удерживать P. GOMAXPROCS(1) означает, что одновременно выполняется только одна горутина, но планировщик может переключать между несколькими G. До Go 1.14 такой бесконечный цикл действительно мог надолго заблокировать выполнение других горутин. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика
4 101
15
🔗 Как Go запускает горутины В Go тысячи горутин не привязаны напрямую к потокам ОС. Runtime распределяет их через GMP-модель
🔗 Как Go запускает горутины В Go тысячи горутин не привязаны напрямую к потокам ОС. Runtime распределяет их через GMP-модель: ⬇️G (Goroutine) — что ⬇️нужно выполнить; ⬇️M (Machine) — поток ОС, ⬇️на котором выполняется ⬇️код; ⬇️P (Processor) — ресурс ⬇️планировщика, который ⬇️связывает G и M. У каждого P есть своя локальная очередь горутин. Если работы не хватает, планировщик может взять её из глобальной очереди или украсть часть очереди другого P — это work-stealing. 🟡 А если M блокируется на syscall, P не обязан ждать его возвращения: runtime может передать P другому потоку через handoff. 🟡 Отдельно за состоянием runtime следит sysmon, а сетевые операции обслуживает netpoller, поэтому ожидание I/O обычно не означает простой потока ОС. Именно эта связка позволяет Go одновременно держать много горутин и эффективно использовать несколько CPU. А вся схема — на картинке 🤩 🔗 Читать подробнее про планировщик 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
3 940
16
💡 Почему Go нельзя просто установить и забыть С Go часто делают так: выбрали версию, прописали её в Dockerfile — и вспоминаем о ней только при следующем большом обновлении. Но security-патчи выходят внутри той же ветки. И если ваша версия старая, опубликованная уязвимость превращает её в известную цель. 📍 Поэтому версия Go в проде должна обновляться примерно так же, как обычные зависимости. Что стоит сделать: — закрепить конкретный toolchain в go.mod; — регулярно пересобирать Docker-образ; — следить за security-анонсами Go; — проверять зависимости через govulncheck. Например: toolchain go1.26.6 А CI может брать версию прямо из go.mod: - uses: actions/setup-go@v5 with: go-version-file: go.mod 🔗 Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
4 271
17
🚨 Go 1.27 поменял encoding/json изнутри API старого encoding/json остался прежним, но под капотом теперь работает новый движок encoding/json/v2. Для существующего кода это должно быть прозрачно — Go сохраняет старую семантику через набор compatibility-опций. Но производительность изменилась. В независимом бенчмарке на одинаковых данных: 🔘 Unmarshal в структуру — примерно в 1,5 раза быстрее; 🔘 Unmarshal в any — примерно в 1,5 раза медленнее; 🔘 Marshal — немного медленнее, зато заметно меньше аллокаций; 🔘 потоковая работа через новый API MarshalWrite требует значительно меньше памяти. Самая интересная ловушка — any. Старый API разрешает дубликаты ключей JSON, поэтому новый движок не может использовать свой быстрый путь для any. В результате динамический JSON может обрабатываться медленнее. 🤩 А если перейти непосредственно на encoding/json/v2, появляются новые дефолты: дубликаты ключей и невалидный UTF-8 отклоняются, nil-слайсы и map по умолчанию кодируются иначе, а порядок ключей map не гарантируется без Deterministic. После перехода на Go 1.27 недостаточно проверить только компиляцию. Если encoding/json находится на горячем пути — стоит прогнать свои бенчмарки. Особенно если приложение активно работает с any или map[string]any. А encoding/json/v2 уже можно внедрять постепенно, сохраняя нужные v1-семантики через DefaultOptionsV1(). 🔗 Официальный гайд по миграции encoding/json/v2 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
4 592
18
🤩 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
4 431
19
🧹 t.Cleanup: уборка в Go-тестах без лишних defer Подняли тестовую БД, создали временный файл или запустили сервер? t.Cleanup позволяет привязать очистку прямо к жизненному циклу теста. 🟡 Главный плюс — хелперы могут сами отвечать за освобождение ресурсов: func newTestDB(t *testing.T) *sql.DB { t.Helper() db := openTempDB(t) t.Cleanup(func() { db.Close() }) return db } 🟡 Теперь тесту не нужно помнить про defer: func TestUsers(t *testing.T) { db := newTestDB(t) // ... } Cleanup выполнится после завершения теста, даже если тот упал через t.Fatal. Несколько cleanup-функций выполняются в обратном порядке регистрации. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
3 968
20
🤩 templ: типобезопасный HTML в Go html/template работает со строковыми шаблонами, а templ позволяет писать HTML-компоненты п
🤩 templ: типобезопасный HTML в Go html/template работает со строковыми шаблонами, а templ позволяет писать HTML-компоненты прямо в .templ и превращать их в обычный Go-код. templ Hello(name string) { <div class="greeting">Привет, { name }</div> } После templ generate компонент можно использовать как обычную функцию: view.Hello("гофер").Render(ctx, w) 📍 Плюс — типы и ошибки в компонентах проверяются при компиляции, есть автоматическое экранирование HTML. Особенно удобно для серверного рендеринга и связки Go + htmx, когда полноценный frontend-фреймворк не нужен. 🔗 ⁠templ · ⁠GitHub 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
4 362