Go — это язык, который любят за простоту и мощь, но даже опытные разработчики иногда спотыкаются о подводные камни конкурентности, управления памятью или проектирования микросервисов. Я каждый день работаю с Go и активно использую AI-ассистентов, чтобы ускорить рутину и находить элегантные решения. В этой подборке — 12 проверенных промтов, которые реально экономят часы работы. Они не про «напиши код», а про то, как заставить нейросеть думать вместе с вами, как старшего коллегу. Ниже — конкретные формулировки, примеры использования и ожидаемый результат.
Промт №1: Разбор конкурентного кода на предмет гонок данных
Проблема: Вы написали код с горутинами, но он работает нестабильно, периодически падает с fatal error: concurrent map writes или дает неверные результаты.
Решение: Попросите ИИ провести code review с фокусом на data races. Промт:
Ты — senior Go-разработчик. Проведи аудит этого кода на предмет гонок данных (data races) и проблем с синхронизацией. Укажи конкретные строки, объясни, почему возникает гонка, и предложи исправление с использованием мьютексов, атомиков или каналов. Код:
go var counter int func increment() { for i := 0; i < 1000; i++ { counter++ } } func main() { go increment() go increment() time.Sleep(time.Second) fmt.Println(counter) }
Результат: ИИ объяснит, что counter++ — не атомарная операция, и предложит использовать sync.Mutex или atomic.AddInt64. Это экономит время на отладке.
Промт №2: Генерация идоматичного кода для работы с каналами
Проблема: Нужно реализовать паттерн worker pool, но не хочется изобретать велосипед.
Решение: Попросите сгенерировать код с использованием каналов, воркеров и graceful shutdown. Промт:
Сгенерируй идоматичный Go-код для пула воркеров, который обрабатывает задания из канала jobs, отправляет результаты в канал results, поддерживает конкурентность N воркеров и корректно завершается по сигналу. Используй контекст и
sync.WaitGroup. Пример задания — просто функция, которая возвращает квадрат числа.
Результат: Получите готовый код с правильной обработкой закрытия каналов и ожиданием завершения всех воркеров.
Промт №3: Оптимизация производительности с помощью pprof
Проблема: Приложение потребляет слишком много памяти или CPU, нужно найти узкое место.
Решение: Используйте промт для анализа профиля. Промт:
У меня есть Go-приложение, которое потребляет 2 ГБ памяти, хотя должно укладываться в 500 МБ. Вот вывод
go tool pprofдля heap: [вставьте вывод]. Проанализируй, какие функции создают больше всего объектов, и предложи оптимизации. Также подскажи, как использоватьruntime.MemStatsдля диагностики.
Результат: ИИ укажет на конкретные аллокации и предложит использовать sync.Pool, изменить структуры данных или избежать утечек горутин.
Промт №4: Проектирование микросервиса с нуля
Проблема: Нужно спроектировать архитектуру нового микросервиса на Go, но хочется следовать best practices.
Решение: Попросите ИИ спроектировать структуру проекта. Промт:
Спроектируй структуру Go-микросервиса для REST API, который обрабатывает заказы. Учитывай: чистая архитектура, разделение на слои (handlers, services, repositories), работа с PostgreSQL через
database/sql, использованиеcontext.Context, graceful shutdown, конфигурация через env-переменные. Предложи структуру папок и опиши ответственность каждого модуля.
Результат: Получите каркас проекта, который можно сразу начать наполнять кодом.
Промт №5: Написание тестов с использованием table-driven подходов
Проблема: Нужно покрыть тестами функцию, которая обрабатывает разные кейсы, но писать сотни одинаковых тестов — скучно.
Решение: Попросите сгенерировать table-driven тесты. Промт:
Напиши table-driven тесты для функции
func ParseDuration(s string) (time.Duration, error), которая парсит строки вида "1h30m". Включи кейсы: валидные строки, некорректные, пустые, с пробелами. Используй стандартный пакетtesting. Выведи код теста.
Результат: Готовый тест с таблицей кейсов, который легко расширять.
Промт №6: Рефакторинг с сохранением поведения
Проблема: Есть legacy-код, который нужно отрефакторить, но страшно изменить поведение.
Решение: Попросите ИИ выполнить рефакторинг с объяснением шагов. Промт:
Отрефактори этот Go-код, сохранив его поведение. Улучши читаемость, вынеси дублирование в функции, замени
interface{}наany(Go 1.18+). Объясни каждый шаг рефакторинга. Код: [вставьте код]. После рефакторинга предложи, какие тесты нужно написать для проверки.
Результат: Улучшенный код с пояснениями и планом тестирования.
Промт №7: Генерация документации в формате GoDoc
Проблема: Нужно задокументировать экспортируемые функции, но писать комментарии вручную — долго.
Решение: Попросите ИИ сгенерировать комментарии. Промт:
Сгенерируй комментарии в формате GoDoc для следующего кода. Каждая экспортируемая функция должна иметь комментарий, начинающийся с имени функции, описывающий параметры и возвращаемые значения. Пример:
// Add sums two integers.. Код: [вставьте код].
Результат: Готовая документация, которую можно сразу вставить в код.
Промт №8: Объяснение сложных концепций
Проблема: Непонятно, как работает select с несколькими каналами или в чем разница между sync.Mutex и sync.RWMutex.
Решение: Попросите объяснить на примере. Промт:
Объясни, как работает
selectв Go, с примерами. Покажи, как использоватьselectс таймаутом, с несколькими каналами, сdefault. Приведи реальный сценарий, например, ожидание ответа от двух сервисов.
Результат: Понятное объяснение с кодом, который можно запустить.
Промт №9: Поиск утечек горутин
Проблема: Приложение со временем потребляет все больше памяти, подозрение на утечку горутин.
Решение: Попросите ИИ помочь найти утечку. Промт:
У меня есть Go-приложение, которое запускает горутины для обработки запросов. Через несколько часов работы потребление памяти растет. Вот код, который запускает горутины: [вставьте код]. Как проверить, есть ли утечка горутин? Предложи методы с использованием
runtime.NumGoroutine()иgo tool pprof. Также покажи, как использоватьcontext.WithCancelдля корректного завершения горутин.
Результат: План диагностики и исправления.
Промт №10: Интеграция с внешними API
Проблема: Нужно написать клиент для внешнего REST API с обработкой ошибок и ретраев.
Решение: Попросите сгенерировать код. Промт:
Напиши Go-клиент для REST API, которое возвращает JSON. Реализуй функцию
GetUser(id int) (*User, error)с обработкой статус-кодов 404, 500, таймаутом в 5 секунд и ретраем до 3 раз с экспоненциальной задержкой. Используйnet/httpиencoding/json. Покажи пример использования.
Результат: Готовый клиент с ретраями и обработкой ошибок.
Промт №11: Написание SQL-запросов с использованием database/sql
Проблема: Нужно выполнить сложный запрос с JOIN и пагинацией, но не хочется ошибиться в синтаксисе.
Решение: Попросите сгенерировать код. Промт:
Напиши Go-код для выполнения SQL-запроса к PostgreSQL, который выбирает заказы пользователя с JOIN на таблицу товаров, с пагинацией (LIMIT и OFFSET) и фильтром по дате. Используй
database/sqlи_ "github.com/lib/pq". Приведи код с подготовленными выражениями (PreparedStatement).
Результат: Код с правильным использованием QueryContext и Scan.
Промт №12: Проектирование Graceful Shutdown
Проблема: Приложение должно корректно завершаться по сигналу, сохраняя незавершенные запросы.
Решение: Попросите реализовать паттерн. Промт:
Реализуй graceful shutdown для HTTP-сервера на Go. Используй
signal.NotifyContext,http.Server.Shutdownс таймаутом. Покажи, как дождаться завершения всех текущих запросов и закрыть соединения с БД. Приведи полный кодmain.go.
Результат: Готовый шаблон, который можно вставить в проект.
Как выжать максимум из этих промтов
- Всегда уточняйте версию Go (1.22, 1.23 и т.д.), чтобы ИИ использовал актуальный синтаксис.
- Если промт не дал ожидаемого результата, добавьте контекст: «учти, что у нас используется фреймворк Gin» или «мы работаем с MongoDB, а не PostgreSQL».
- Не бойтесь задавать уточняющие вопросы: «А почему ты выбрал именно этот паттерн?» — это помогает глубже понять решение.
Эти промты — не магия, а инструмент. Они экономят время на рутине, но не заменяют понимание языка. Используйте их как стартовую точку, а критическое мышление оставляйте за собой. Если у вас есть свои проверенные промты для Go — делитесь в комментариях, давайте соберем базу знаний.
Комментарии