Go — это язык, который создавался для микросервисов: быстрая компиляция, встроенная конкурентность, простота деплоя. Но даже с таким мощным инструментом разработка распределённых систем остаётся вызовом: проектирование API, обработка ошибок, таймауты, ретраи, трассировка, оптимизация памяти — всё это требует опыта и внимания к деталям. Что если часть рутины можно делегировать нейросети? В этой статье я собрал 10 промтов, которые реально экономят часы работы: от генерации каркаса сервиса до поиска утечек горутин. Никакой магии — только конкретные инструкции, проверенные на практике.
Важно понимать: LLM — это не замена инженеру, а мощный ассистент. Он не знает контекст вашего проекта, но может сгенерировать отличную отправную точку, объяснить сложную концепцию или найти баг в коде. Главное — правильно составить промт, как запрос к опытному коллеге. Ниже — 10 готовых шаблонов, разделённых по этапам работы: от проектирования до дебага. Каждый промт можно скопировать, вставить и адаптировать под свою задачу.
1. Проектирование: от идеи до схемы сервиса
Когда использовать: вы только начинаете новый микросервис и хотите быстро получить структуру, а не рисовать её в голове.
Промт:
Ты — архитектор ПО с 10-летним опытом в Go. Спроектируй микросервис для [описание задачи].
Требования:
- REST API, но с возможностью перейти на gRPC позже.
- Хранение данных: PostgreSQL.
- Очереди: Kafka.
- Конкурентность: горутины + каналы.
- Наблюдаемость: Prometheus + OpenTelemetry.
Выдай:
1. Структуру каталогов проекта (стандартный layout с cmd/, internal/, pkg/).
2. Список основных пакетов и их ответственность.
3. Эндпоинты API с методами и примерами запросов/ответов.
4. Схему БД (таблицы, поля, индексы).
5. Обработку ошибок и логирования.
6. Потенциальные узкие места и как их избежать.
Формат ответа: Markdown с диаграммами ASCII.
Пример использования: Допустим, вам нужно создать сервис для обработки заказов. Замените [описание задачи] на «сервис приёма и обработки заказов в интернет-магазине с поддержкой корзины, оплаты и уведомлений». Нейросеть вернёт структуру, которую можно сразу использовать как план. Вы сэкономите час-полтора на проектировании.
2. Генерация каркаса микросервиса
Когда использовать: нужно быстро создать рабочий шаблон с подключением всех зависимостей.
Промт:
Сгенерируй минимальный работоспособный код микросервиса на Go для [задача].
Требования:
- Используй стандартную библиотеку net/http и паттерн «контекст».
- Подключи PostgreSQL через database/sql + lib/pq.
- Добавь graceful shutdown.
- Реализуй health check эндпоинт /healthz.
- Обработай таймауты для HTTP-сервера и исходящих запросов.
- Код должен быть готов к запуску: main.go, Dockerfile, docker-compose.yml.
Выдай полный код каждого файла с комментариями на русском.
Пример: Попросите сгенерировать «сервис сокращения URL». На выходе получите main.go с настройкой роутера, подключением к БД, обработчиком POST /shorten и GET /{code}. Плюс Dockerfile и docker-compose. Останется добавить бизнес-логику и тесты.
3. Оптимизация: ищем утечки горутин
Когда использовать: сервис начинает потреблять всё больше памяти, а pprof показывает рост числа горутин.
Промт:
Помоги найти утечку горутин в Go-приложении. Вот код:
[вставьте код]
Проанализируй:
1. Где горутины могут блокироваться навсегда (например, на канале, который никто не закрывает).
2. Правильно ли используются контексты (ctx) — есть ли случаи, когда отмена не пробрасывается?
3. Есть ли места, где time.Sleep используется вместо таймеров с каналами?
4. Предложи конкретные исправления с примерами кода.
Пример: вы вставили код, который запускает горутину для каждого входящего запроса и пишет в канал, который никто не читает. Нейросеть укажет на это и предложит использовать буферизированный канал или select с ctx.Done(). Это типичная ошибка, которую легко пропустить глазами.
4. Профилирование: чтение отчётов pprof
Когда использовать: нужно понять, почему CPU или память используются неэффективно.
Промт:
У меня есть отчёт pprof (CPU profile). Вот вывод команды `go tool pprof -top`:
[вставьте вывод]
Объясни:
1. Какие функции занимают больше всего времени и почему.
2. Есть ли аномалии: например, неожиданные аллокации, блокировки, частые вызовы runtime.morestack.
3. Предложи, как оптимизировать: изменить алгоритм, добавить кэш, уменьшить количество аллокаций.
4. Дай конкретные рекомендации по коду.
Пример: вывод показывает, что 70% времени уходит на json.Unmarshal. Нейросеть посоветует использовать json.Decoder с буфером или перейти на easyjson для больших структур. Это практический совет, который сэкономит вам часы исследований.
5. Написание тестов: юнит и интеграционные
Когда использовать: нужно быстро покрыть ключевую логику тестами.
Промт:
Напиши юнит-тесты для следующего кода на Go:
[вставьте код]
Требования:
- Используй стандартный пакет testing и табличные тесты (table-driven).
- Покрой основные ветви: успех, ошибка валидации, граничные случаи.
- Для моков используй интерфейсы, а не конкретные типы.
- Приведи пример запуска тестов с покрытием.
Пример: вы написали функцию CalculateDiscount(price float64, userType string) float64. Нейросеть сгенерирует таблицу с кейсами: обычный пользователь, VIP, нулевая цена, отрицательная цена. Вы получите готовый файл main_test.go и сможете сразу запустить go test -cover.
6. Отладка паник и ошибок
Когда использовать: приложение падает с непонятным стектрейсом.
Промт:
Вот стектрейс паники из Go-приложения:
[вставьте стектрейс]
Объясни:
1. Где именно происходит паника (функция, строка).
2. Какая вероятная причина (nil pointer, индекс вне диапазона, закрытый канал).
3. Как исправить: добавь проверку на nil, используй recover, и т.д.
4. Приведи исправленный фрагмент кода.
Пример: стектрейс показывает panic: runtime error: invalid memory address or nil pointer dereference в func (s *Server) handleRequest. Нейросеть подскажет, что s.db не инициализирован, и предложит проверку в NewServer(). Это ускорит дебаг в разы.
7. Рефакторинг: улучшаем читаемость и производительность
Когда использовать: код работает, но выглядит как «спагетти» из-за копипасты и длинных функций.
Промт:
Проведи рефакторинг следующего кода на Go:
[вставьте код]
Цели:
- Улучши читаемость: разбей длинные функции на более мелкие.
- Убери дублирование (DRY).
- Замени циклы на итераторы, если это уместно.
- Используй идиоматичные паттерны Go: errgroup, sync.Once, context.
- После рефакторинга код должен проходить те же тесты.
Покажи diff или полный новый код.
Пример: у вас есть функция, которая обрабатывает список заказов и внутри неё три цикла с одинаковой логикой валидации. Нейросеть вынесет валидацию в отдельную функцию и упростит основной код. Вы получите более чистую версию, которую легче поддерживать.
8. Работа с конкурентностью: паттерны и ошибки
Когда использовать: нужно реализовать конкурентную обработку задач, но есть риск гонок данных.
Промт:
Предложи и реализуй на Go паттерн для следующей задачи:
[описание задачи: например, параллельная обработка N задач с ограничением количества одновременных горутин]
Требования:
- Используй errgroup с контекстом (golang.org/x/sync/errgroup).
- Ограничь конкурентность с помощью semaphore (chan struct{}).
- Корректно обработай ошибки: если одна задача падает, остальные должны быть отменены.
- Покажи полный код с комментариями.
Пример: вы хотите скачать 100 файлов, но не более 10 одновременно. Промт вернёт код с errgroup и буферизированным каналом в качестве семафора. Это стандартное решение, но нейросеть сгенерирует его за секунды.
9. Интеграция с внешними сервисами: таймауты и ретраи
Когда использовать: ваш микросервис вызывает внешний API, и нужно правильно настроить таймауты и повторы.
Промт:
Реализуй на Go HTTP-клиент с таймаутами, ретраями и экспоненциальной задержкой для вызова [внешний API].
Требования:
- Используй net/http.Client с Timeout.
- Для ретраев используй github.com/cenkalti/backoff/v4.
- Учитывай идемпотентность: добавь заголовок X-Request-ID.
- Обрабатывай ответы 429 и 5xx.
- Логируй каждый ретрай.
Напиши полный код с комментариями.
Пример: вы подключаетесь к платёжному шлюзу. Нейросеть сгенерирует клиент, который автоматически повторит запрос при 500-й ошибке и подождёт с экспоненциальной задержкой. Это критично для надёжности микросервисов.
10. Генерация OpenAPI-спецификации
Когда использовать: нужно задокументировать API для команды или сгенерировать клиент.
Промт:
Создай OpenAPI 3.0 спецификацию для следующего API:
[опишите эндпоинты, методы, параметры]
Требования:
- Укажи схемы данных для запросов и ответов.
- Добавь описание ошибок (4xx, 5xx) с примерами.
- Используй компоненты для переиспользования схем.
- Формат: YAML.
- Укажи серверы (base URL) и версию.
Пример: вы описали «эндпоинт POST /users, GET /users/{id}, DELETE /users/{id}». Нейросеть сгенерирует полный YAML-файл, который можно использовать с Swagger UI или для генерации клиента через openapi-generator. Это экономит время на ручном написании документации.
11. Написание Dockerfile и CI-пайплайна
Когда использовать: нужно упаковать микросервис в Docker и настроить автоматическую сборку и тесты.
Промт:
Создай Dockerfile и CI-конфигурацию (GitHub Actions) для Go-микросервиса.
Требования:
- Многоступенчатая сборка: сначала build, потом final image на основе alpine.
- Скопируй только бинарник и необходимые файлы.
- Добавь healthcheck.
- CI: запуск go test, go vet, golangci-lint, сборка образа и публикация в GitHub Container Registry.
Выдай полный код файлов.
Пример: вы получите готовый Dockerfile с этапом сборки (golang:1.22-alpine) и финальным образом (alpine:3.19), а также workflow-файл для GitHub Actions, который автоматически запустит тесты при каждом пуше. Это стандарт для современных Go-проектов.
12. Как объяснить новичку: обучение на примерах
Когда использовать: вы наставляете джуна или коллегу, который только учит Go, и хотите быстро объяснить концепцию.
Промт:
Объясни [концепция: например, горутины и каналы] новичку в Go.
Используй:
- Аналогии из жизни.
- Минимальный пример кода.
- Типичные ошибки и как их избежать.
- Ссылки на официальную документацию (go.dev).
Формат: короткий текст с примерами.
Пример: вы просите объяснить горутины. Нейросеть приведёт аналогию с официантами в ресторане, покажет код с go func() и channel, предупредит о гонках данных. Это удобно для онбординга.
Как выбрать промт под свою задачу
Каждый промт выше — это шаблон, который нужно адаптировать: добавить конкретику, вставить свой код или описание. Ниже — таблица, которая поможет быстро сориентироваться:
| Ситуация | Какой промт использовать |
|---|---|
| Нужен каркас сервиса | №2 |
| Проектирую архитектуру | №1 |
| Сервис тормозит | №4 |
| Падает с паникой | №6 |
| Пишу тесты | №5 |
| Делаю рефакторинг | №7 |
| Настраиваю конкурентность | №8 |
| Интеграция с внешним API | №9 |
| Документирую API | №10 |
| Упаковываю в Docker | №11 |
Важно: промты не заменяют понимание Go. Они экономят время на рутине, но финальное решение всегда за вами. Всегда проверяйте сгенерированный код и не забывайте про go vet и go test.
Будущее Go-разработки с LLM
LLM уже сегодня становятся незаменимым помощником бэкенд-разработчика. По моему опыту, использование промтов сокращает время на написание шаблонного кода на 30–40%. Но главное — они помогают избежать типичных ошибок, которые возникают из-за невнимательности или незнания тонкостей языка.
Попробуйте применить эти промты в своём следующем проекте. Начните с малого: например, попросите сгенерировать тесты для одной функции. Как только увидите результат, вы поймёте, как делегировать рутину и сосредоточиться на действительно сложных задачах — проектировании распределённых систем и бизнес-логике.
А если вы хотите системно прокачаться в Go и микросервисах, обратите внимание на курсы, где практика с AI-инструментами встроена в процесс обучения. Удачи в разработке!
Комментарии