Промты для Go-разработчика: 12 сценариев от горутин и gRPC до профилирования и деплоя в Kubernetes
Go — это язык, который любят за простоту и производительность. Но даже опытные разработчики тратят часы на рутинные задачи: написание идиоматичного кода, отладку горутин, оптимизацию памяти, подготовку Dockerfile и манифестов Kubernetes. AI-ассистенты, такие как ChatGPT, могут стать мощным ускорителем, если знать, как правильно формулировать запросы. В этой подборке — 12 проверенных промтов, которые покрывают ключевые сценарии: от генерации кода до профилирования. Каждый промт сопровождается примером задачи, готовым текстом запроса и пояснением, что именно он решает в реальном проде.
1. Генерация идиоматичного кода: обработка ошибок
Задача: Написать функцию чтения файла с корректной обработкой ошибок в стиле Go.
Промт:
Напиши на Go функцию ReadFileContent(path string) (string, error), которая читает файл и возвращает его содержимое. Используй идиоматичную обработку ошибок с fmt.Errorf и %w. Добавь проверку на пустой путь.
Пример результата:
func ReadFileContent(path string) (string, error) {
if path == "" {
return "", fmt.Errorf("путь к файлу не может быть пустым")
}
data, err := os.ReadFile(path)
if err != nil {
return "", fmt.Errorf("ошибка чтения файла %s: %w", path, err)
}
return string(data), nil
}
Что решает: Позволяет быстро получить корректный код без забытых проверок, что снижает количество паник в проде.
2. Работа с горутинами и каналами: паттерн worker pool
Задача: Реализовать пул воркеров для параллельной обработки задач.
Промт:
Напиши на Go пример реализации worker pool с использованием горутин и каналов. Функция должна принимать количество воркеров и список задач, возвращать результаты. Используй sync.WaitGroup.
Пример результата:
func WorkerPool(workers int, tasks []string) []string {
jobs := make(chan string, len(tasks))
results := make(chan string, len(tasks))
var wg sync.WaitGroup
for w := 0; w < workers; w++ {
wg.Add(1)
go func() {
defer wg.Done()
for task := range jobs {
results <- process(task)
}
}()
}
for _, task := range tasks {
jobs <- task
}
close(jobs)
wg.Wait()
close(results)
var out []string
for r := range results {
out = append(out, r)
}
return out
}
Что решает: Ускоряет обработку задач, избегая ручного управления горутинами.
3. Оптимизация памяти: уменьшение аллокаций
Задача: Снизить количество аллокаций в горячем пути.
Промт:
Проанализируй этот код на Go и предложи оптимизации для уменьшения аллокаций в куче. Используй sync.Pool или предварительное выделение слайсов.
Пример результата: AI предлагает заменить make([]byte, 0, 1024) на переиспользуемый буфер через sync.Pool.
Что решает: Снижает нагрузку на GC и улучшает latency.
4. Написание тестов и бенчмарков
Задача: Сгенерировать табличные тесты и бенчмарки для функции.
Промт:
Напиши табличные тесты и бенчмарк для функции Sum(a, b int) int. Используй пакет testing.
Пример результата:
func TestSum(t *testing.T) {
cases := []struct{ a, b, want int }{
{1, 2, 3},
{-1, 1, 0},
}
for _, c := range cases {
if got := Sum(c.a, c.b); got != c.want {
t.Errorf("Sum(%d, %d) = %d, want %d", c.a, c.b, got, c.want)
}
}
}
func BenchmarkSum(b *testing.B) {
for i := 0; i < b.N; i++ {
Sum(1, 2)
}
}
Что решает: Экономит время на написание шаблонного кода тестов.
5. Проектирование gRPC-сервиса
Задача: Создать .proto файл и сгенерировать сервер на Go.
Промт:
Создай .proto файл для gRPC-сервиса UserService с методами GetUser и CreateUser. Сгенерируй Go-код и реализуй сервер.
Пример результата: AI выдаёт .proto и команду protoc --go_out=. --go-grpc_out=. user.proto.
Что решает: Ускоряет создание API-контрактов.
6. Отладка утечек горутин
Задача: Найти утечку горутин в коде.
Промт:
Проанализируй код на Go на предмет утечек горутин. Предложи исправления с использованием context.Context.
Пример результата: AI указывает на горутину, которая не завершается при отмене контекста, и предлагает добавить select { case <-ctx.Done(): return }.
Что решает: Предотвращает исчерпание ресурсов.
7. Профилирование через pprof
Задача: Собрать и проанализировать профиль CPU.
Промт:
Как добавить pprof в Go-приложение? Напиши пример с net/http/pprof и команду для анализа профиля.
Пример результата: AI даёт код импорта _ "net/http/pprof" и команду go tool pprof http://localhost:8080/debug/pprof/profile.
Что решает: Помогает быстро найти узкие места.
8. Подготовка Dockerfile
Задача: Написать многоступенчатый Dockerfile для Go-приложения.
Промт:
Напиши Dockerfile для Go-приложения с многоступенчатой сборкой. Используй alpine как базовый образ.
Пример результата:
FROM golang:1.23 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o main .
FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["/main"]
Что решает: Уменьшает размер образа и ускоряет деплой.
9. Манифесты Kubernetes
Задача: Создать Deployment и Service для Go-приложения.
Промт:
Напиши манифесты Kubernetes для Deployment и Service Go-приложения. Укажи liveness и readiness пробу.
Пример результата: YAML с livenessProbe на /healthz.
Что решает: Автоматизирует рутинную настройку.
10. Рефакторинг кода под интерфейсы
Задача: Заменить конкретную реализацию на интерфейс для тестируемости.
Промт:
Отрефактори этот код на Go, чтобы использовать интерфейсы для работы с БД. Покажи, как замокать в тестах.
Пример результата: AI выделяет интерфейс UserRepository и предлагает использовать gomock.
Что решает: Упрощает написание юнит-тестов.
11. Оптимизация SQL-запросов
Задача: Ускорить запрос с помощью индексов.
Промт:
Проанализируй SQL-запрос и предложи индексы для ускорения. Используй EXPLAIN ANALYZE.
Пример результата: AI рекомендует составной индекс по полям.
Что решает: Снижает время ответа API.
12. Генерация Swagger-документации
Задача: Автоматически создать OpenAPI-спецификацию.
Промт:
Сгенерируй Swagger-аннотации для Go-хендлеров с использованием swaggo.
Пример результата: Комментарии вида // @Summary Get user.
Что решает: Упрощает поддержку документации.
Эти 12 промтов покрывают основные задачи Go-разработчика. Используйте их как шаблоны, адаптируя под свой контекст. AI не заменит инженера, но снимет рутину и ускорит решение типовых проблем. Экспериментируйте, комбинируйте, и пусть ваш код будет чистым, а деплой — быстрым.
Комментарии