Введение
Go и Rust сегодня — два главных языка для высоконагруженных бэкенд-сервисов. Go берёт простотой конкурентности (горутины, каналы), Rust — безопасностью памяти без сборщика мусора и предсказуемой производительностью. Но даже опытные разработчики тратят часы на рутинные задачи: написание идемпотентных хендлеров, борьбу с borrow checker, профилирование и оптимизацию аллокаций. AI-ассистенты могут ускорить эти процессы, если правильно формулировать промты.
В этой подборке — 11 готовых промтов для реальных инженерных задач 2026 года. Каждый промт — это конкретный запрос к LLM (например, ChatGPT, Claude или локальной модели), который выдаёт рабочий код или пошаговый план. Мы не привязываемся к конкретному инструменту — промты универсальны. Все примеры проверены на актуальных версиях Go 1.22+ и Rust 1.75+.
1. Генерация идемпотентного gRPC-хендлера на Go
Задача: Написать gRPC-метод, который безопасен при повторных вызовах (идемпотентность). Часто требуется в платежах, заказах, обновлении статусов.
Промт:
Ты — senior Go-разработчик. Напиши идемпотентный gRPC-хендлер для метода UpdateOrderStatus. Вход: order_id, new_status, idempotency_key. Используй PostgreSQL для хранения ключей идемпотентности с TTL 24 часа. При повторном запросе с тем же ключом возвращай предыдущий ответ. Код должен использовать библиотеку google.golang.org/grpc и pgx. Добавь обработку ошибок и логирование.
Пример использования:
Вы пишете сервис заказов. Клиент может отправить запрос дважды из-за сетевого сбоя. Промт сгенерирует функцию, которая проверяет таблицу idempotency_keys, и если ключ уже есть — возвращает сохранённый ответ, иначе выполняет операцию и сохраняет результат.
Результат (сокращённо):
func (s *OrderService) UpdateOrderStatus(ctx context.Context, req *pb.UpdateOrderStatusRequest) (*pb.UpdateOrderStatusResponse, error) {
tx, err := s.db.Begin(ctx)
if err != nil { return nil, err }
defer tx.Rollback(ctx)
var prevResp pb.UpdateOrderStatusResponse
err = tx.QueryRow(ctx, "SELECT response FROM idempotency_keys WHERE key=$1 AND expires_at > now()", req.IdempotencyKey).Scan(&prevResp)
if err == nil {
return &prevResp, nil
}
// ... выполнение обновления и сохранение ответа
}
2. Паттерн Worker Pool на Go с ограничением конкурентности
Задача: Обработать тысячи задач параллельно, не перегружая БД или внешний API. Нужен worker pool с динамическим размером.
Промт:
Напиши на Go worker pool для обработки задач из канала. Количество воркеров задаётся флагом. Каждый воркер делает HTTP-запрос к внешнему API с таймаутом 5 секунд. При ошибке — 3 ретрая с экспоненциальной задержкой. Используй context для отмены. Покажи пример с graceful shutdown.
Пример:
Сервис получает список URL для парсинга. Промт сгенерирует код с sync.WaitGroup, буферизованным каналом задач и обработкой сигналов ОС для корректного завершения.
Совет: Добавьте в промт «используй errgroup из golang.org/x/sync/errgroup» — получите более идиоматичный код.
3. Обход borrow checker в Rust без unsafe
Задача: Компилятор Rust не даёт собрать код из-за одновременного изменяемого и неизменяемого заимствования. Нужно решить без unsafe.
Промт:
У меня ошибка borrow checker: cannot borrow `data` as mutable because it is also borrowed as immutable. Вот код: [вставить код]. Предложи 3 способа исправить без unsafe: 1) через разделение структур, 2) через индексы вместо ссылок, 3) через interior mutability (RefCell, Mutex). Объясни плюсы и минусы каждого.
Пример:
Вы пишете кэш с обновлением. Промт покажет, как заменить хранение ссылок на хранение индексов или использовать Rc<RefCell<>> для разделяемого состояния.
4. Профилирование Go-сервиса через pprof и flamegraph
Задача: Найти узкие места по CPU и памяти. Нужен пошаговый план.
Промт:
Ты — эксперт по производительности Go. Напиши инструкцию: как добавить pprof в HTTP-сервер, снять профили CPU и heap, сгенерировать flamegraph с помощью go-torch или pprof. Какие метрики смотреть в первую очередь? Приведи примеры команд.
Пример:
Сервис тормозит под нагрузкой. Промт выдаст команды:
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30
И объяснит, как читать flamegraph: ищите широкие блоки — это функции с высоким self-time.
5. Снижение аллокаций в Rust: замена String на &str
Задача: Уменьшить количество аллокаций в горячем пути. Часто помогает переход на срезы и Cow.
Промт:
Проанализируй функцию на Rust: [вставить код]. Найди все места, где происходят лишние аллокации (String, Vec, clone). Предложи замены на &str, Cow<str>, arrayvec или SmallVec. Покажи diff и объясни, как это повлияет на производительность и время жизни.
Пример:
Функция парсинга JSON создаёт много временных String. Промт предложит использовать serde_json::from_str с заимствованием и &str вместо String.
6. Идемпотентный REST-хендлер на Rust с Actix Web
Задача: Реализовать идемпотентность для POST-запросов в микросервисе на Rust.
Промт:
Напиши на Rust с Actix Web и sqlx идемпотентный POST-хендлер для создания платежа. Используй заголовок Idempotency-Key. Храни ключи в PostgreSQL с TTL. При повторном запросе возвращай тот же ответ. Добавь валидацию и обработку ошибок.
Пример:
Аналогично Go-версии, но с учётом асинхронности Tokio и типов sqlx.
7. Асинхронный пайплайн на Tokio с ограничением параллелизма
Задача: Обработать поток данных с ограничением количества одновременных задач.
Промт:
Напиши на Rust асинхронный пайплайн: читаем строки из файла, для каждой делаем HTTP-запрос, но не более 10 одновременно. Используй tokio, futures::stream, buffer_unordered. Добавь обработку ошибок и логирование.
Пример:
Промт сгенерирует код с stream::iter(...).map(...).buffer_unordered(10).collect::<Vec<_>>().await.
8. Graceful shutdown для Go-сервиса с горутинами
Задача: Корректно завершить работу, дождавшись завершения текущих запросов.
Промт:
Напиши на Go graceful shutdown для HTTP-сервера и фоновых воркеров. Используй context и signal.Notify. При получении SIGINT/SIGTERM сервер перестаёт принимать новые запросы, ждёт завершения активных (таймаут 30 секунд), затем останавливает воркеры.
Пример:
Код с srv.Shutdown(ctx) и wg.Wait().
9. Оптимизация latency в Rust: замена Mutex на RwLock или lock-free
Задача: Снизить contention на блокировках в многопоточном сервисе.
Промт:
Проанализируй код на Rust: [вставить]. Есть ли contention на Mutex? Предложи замену на RwLock, DashMap или lock-free структуры (crossbeam). Покажи, как изменится код и какие подводные камни.
Пример:
Если большая часть операций — чтение, RwLock даст прирост. Промт покажет замену.
10. Генерация тестов на конкурентность в Go (race detector)
Задача: Написать тесты, которые выявляют гонки данных.
Промт:
Напиши тесты на Go для функции [название], которая использует горутины и общий доступ к map. Тесты должны запускаться с флагом -race и проверять отсутствие гонок. Используй sync.WaitGroup и каналы.
Пример:
Промт создаст тест, который параллельно вызывает функцию и проверяет результат. Запуск: go test -race.
11. Рефакторинг Rust-кода с использованием трейтов и обобщений
Задача: Убрать дублирование, сделать код расширяемым.
Промт:
Отрефактори Rust-код: [вставить]. Выдели общий трейт для работы с разными типами хранилищ (Postgres, Redis). Используй async-trait. Покажи до и после.
Пример:
Промт предложит трейт Storage с методами get, set, и реализации для каждого бэкенда.
Заключение
Эти 11 промтов покрывают ключевые сценарии работы с Go и Rust в высоконагруженных системах: от идемпотентности и конкурентности до профилирования и безопасной работы с памятью. Используйте их как основу, адаптируя под свой контекст. Помните: AI-ассистент — это инструмент, который ускоряет рутину, но архитектурные решения и финальный код всегда остаются за вами. Экспериментируйте, комбинируйте промты и делитесь своими находками в комментариях.
Полезные ссылки:
- Официальная документация Go: https://go.dev/doc/
- Rust Book: https://doc.rust-lang.org/book/
- Tokio: https://tokio.rs/
- pprof: https://github.com/google/pprof
Комментарии