Go и Rust давно перестали быть экзотикой: на них пишут высоконагруженные бэкенды, микросервисы и системные утилиты. Но переход с Python или ускорение существующего кода — это боль: горутины, каналы, borrow checker, async/await, профилирование. AI-ассистенты вроде Claude, GPT или Codex могут стать вашим вторым пилотом, если правильно формулировать промты. В этой подборке — 12 проверенных шаблонов, которые я сам использую в работе. Каждый промт решает конкретную задачу: от генерации идиоматичного кода до миграции легаси и оптимизации узких мест. Вы получите готовые формулировки, примеры использования и пояснения, для каких сценариев они подходят.
Все примеры кода реальны и проверены на Go 1.22+ и Rust 1.75+. Ссылки на официальные источники помогут углубиться. Неважно, новичок вы или опытный инженер — эти промты сэкономят часы рутины.
1. Генерация идиоматичного кода на Go: горутины и каналы
Промт:
"Напиши на Go функцию, которая параллельно обрабатывает срез URL, используя worker pool с ограничением конкурентности. Примени горутины, каналы и sync.WaitGroup. Добавь обработку ошибок и контекст для отмены. Код должен быть идиоматичным и сопровождаться комментариями."
Когда использовать: Когда нужно быстро создать параллельный обработчик задач без гонок и утечек. Подходит для скрапинга, batch-обработки, вызовов API.
Пример:
Вы пишете сервис для проверки доступности 1000 сайтов. AI сгенерирует:
func CheckURLs(ctx context.Context, urls []string, workers int) []error {
jobs := make(chan string, len(urls))
errs := make(chan error, len(urls))
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for url := range jobs {
select {
case <-ctx.Done():
errs <- ctx.Err()
return
default:
resp, err := http.Get(url)
if err != nil {
errs <- err
continue
}
resp.Body.Close()
}
}
}()
}
for _, url := range urls {
jobs <- url
}
close(jobs)
wg.Wait()
close(errs)
var result []error
for err := range errs {
result = append(result, err)
}
return result
}
Этот шаблон экономит 20–30 минут ручного написания и отладки.
2. Оптимизация производительности бэкенда на Go
Промт:
"Проанализируй этот код на Go на предмет узких мест производительности. Предложи оптимизации: аллокации, блокировки, неэффективные циклы. Покажи исправленную версию с бенчмарками до и после. Используй pprof и benchstat."
Когда использовать: Когда сервис тормозит, а профилирование показывает высокую нагрузку на CPU или память.
Пример:
У вас есть функция, которая часто вызывает append без предварительного выделения памяти. AI предложит использовать make([]T, 0, cap) и покажет прирост. Согласно документации Go по оптимизации, это снижает количество аллокаций в разы. После правок вы можете запустить go test -bench=. -benchmem и сравнить результаты.
3. Миграция с Python на Go: перевод сервиса
Промт:
"Переведи этот Python-код на Go, сохранив логику и обработку ошибок. Используй идиоматичные конструкции Go: возврат ошибок, интерфейсы, структуры. Добавь комментарии, объясняющие различия. Учти, что в Python динамическая типизация, а в Go — статическая."
Когда использовать: Когда нужно портировать отдельный модуль или микросервис с Python на Go для повышения производительности.
Пример:
Python-функция парсинга JSON и валидации полей превратится в Go-структуру с тегами и методами валидации. AI сгенерирует:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func (u *User) Validate() error {
if u.Name == "" {
return errors.New("name is required")
}
if u.Age < 0 {
return errors.New("age must be non-negative")
}
return nil
}
Это ускоряет миграцию и снижает риск ошибок.
4. Rust: работа с borrow checker без боли
Промт:
"Объясни, почему этот код на Rust не компилируется из-за borrow checker. Предложи два способа исправления: с использованием владения и заимствования, и с Rc/RefCell. Сравни их по производительности и безопасности. Покажи рабочий код."
Когда использовать: Когда вы боретесь с ошибками заимствования и хотите понять, как идиоматично решить проблему.
Пример:
Классическая ошибка: попытка изменить вектор во время итерации по нему. AI покажет, как использовать индексы или разделить владение. Например, вместо:
for item in &vec {
vec.push(item.clone()); // ошибка
}
нужно использовать Vec::retain или собрать новые элементы в отдельный вектор.
5. Rust async/await: асинхронный сервер на Tokio
Промт:
"Напиши асинхронный TCP-сервер на Rust с использованием Tokio. Обрабатывай подключения конкурентно, используй async/await и каналы для обмена сообщениями. Добавь graceful shutdown. Код должен быть безопасным и без блокировок."
Когда использовать: Для создания высоконагруженных сетевых приложений на Rust.
Пример:
AI сгенерирует скелет сервера с tokio::net::TcpListener, tokio::spawn для каждого соединения и tokio::sync::broadcast для рассылки сообщений. Вы получите готовую основу, которую останется дополнить бизнес-логикой.
6. Профилирование и бенчмарки в Go
Промт:
"Напиши бенчмарк для этой функции на Go, используя testing.B. Добавь профилирование CPU и памяти с помощью pprof. Покажи, как интерпретировать результаты и найти узкое место."
Когда использовать: Когда нужно измерить производительность и оптимизировать критичный участок.
Пример:
func BenchmarkProcess(b *testing.B) {
data := generateData()
b.ResetTimer()
for i := 0; i < b.N; i++ {
Process(data)
}
}
Запустите go test -bench=. -cpuprofile=cpu.out, затем go tool pprof cpu.out. AI подскажет, на что смотреть.
7. Rust: профилирование с cargo flamegraph
Промт:
"Как профилировать Rust-приложение с помощью cargo flamegraph? Напиши пошаговую инструкцию: установка, запуск, анализ. Приведи пример кода с узким местом и покажи, как его оптимизировать."
Когда использовать: Для поиска горячих точек в Rust-коде.
Пример:
Установите cargo install flamegraph, запустите cargo flamegraph --bin myapp. AI объяснит, как читать flamegraph и какие оптимизации применить (например, заменить clone() на ссылки).
8. Конкурентность в Go: паттерн fan-in/fan-out
Промт:
"Реализуй паттерн fan-out/fan-in на Go для параллельной обработки данных с последующей агрегацией. Используй горутины, каналы и select. Добавь таймаут и отмену через context. Покажи пример с обработкой изображений."
Когда использовать: Когда нужно распределить нагрузку между воркерами и собрать результаты.
Пример:
AI сгенерирует код, где несколько горутин читают из одного канала, обрабатывают и пишут в другой, а главная горутина собирает результаты. Это стандартный паттерн для ETL.
9. Миграция с Python на Rust: замена критичных участков
Промт:
"У меня есть Python-функция, которая выполняется слишком медленно. Перепиши её на Rust с использованием PyO3 для вызова из Python. Сохрани интерфейс. Покажи, как собрать и подключить модуль."
Когда использовать: Когда нужно ускорить узкое место в Python-приложении без полного переписывания.
Пример:
Функция обработки строк на Python заменяется на Rust-функцию, экспортируемую через PyO3. AI покажет Cargo.toml с зависимостью pyo3 и пример сборки через maturin. Это даёт ускорение в разы.
10. Обработка ошибок в Go: идиоматичный подход
Промт:
"Перепиши этот код на Go, чтобы обработка ошибок была идиоматичной: используй errors.Is, errors.As, wrapping с %w. Избегай паники. Добавь кастомные типы ошибок."
Когда использовать: Для повышения надёжности и читаемости кода.
Пример:
Вместо if err != nil { return err } AI предложит оборачивать ошибки с контекстом: fmt.Errorf("failed to read config: %w", err). Это упрощает отладку.
11. Rust: макросы для уменьшения бойлерплейта
Промт:
"Напиши макрос на Rust, который генерирует структуру с полями и методами доступа. Используй macro_rules!. Покажи пример использования и объясни, как макрос расширяется."
Когда использовать: Когда нужно избежать повторяющегося кода.
Пример:
Макрос для создания структур с геттерами и сеттерами. AI сгенерирует код и покажет cargo expand для просмотра результата.
12. Тестирование конкурентного кода на Go
Промт:
"Напиши тесты для этой конкурентной функции на Go. Используй race detector, тесты с -race, проверь отсутствие гонок и утечек горутин. Добавь тесты с context cancellation."
Когда использовать: Для гарантии корректности параллельного кода.
Пример:
AI сгенерирует тесты, которые запускают функцию в нескольких горутинах и проверяют результаты. Запуск go test -race выявит гонки. Это критично для продакшена.
Все эти промты можно адаптировать под свой контекст. Главное — давать AI чёткие инструкции и проверять результат. Комбинируйте их, создавайте свои на основе этих шаблонов. Помните: AI — это инструмент, а не замена инженерному мышлению. Удачи в ускорении вашего бэкенда!
Комментарии