Go Service taste — промпт для ChatGPT: правила Go-бэкенда
Набор инженерных правил для Go-сервиса: какой роутер брать, как раскладывать пакеты, что делать с ошибками и логами. Пригодится, когда агент пишет бэкенд с нуля.
Открыть на GitHubЧто делает Go Service taste
Промпт задаёт агенту набор предпочтений бэкендера на Go. Сначала стандартный роутер net/http из Go 1.22, фреймворк — только если без него никак. Раскладка проекта: cmd/<service>/main.go и пакеты в internal/, без pkg/. Сам main.go остаётся тонким: прочитать конфиг, собрать зависимости, поднять сервер.
Дальше идут правила, которые чаще всего забывают. context.Context первым аргументом в любой функции с I/O. Ошибки оборачиваются через fmt.Errorf с %w и проверяются errors.Is и errors.As. Логи — log/slog в JSON, с request ID в каждой строке. Конфиг читается из переменных окружения в одну типизированную структуру на старте, и при нехватке обязательных полей сервис падает сразу, а не через час в проде.
Для данных: SQL руками, типизированный код через sqlc, драйвер pgx с пулом соединений. Интерфейсы объявляются в пакете-потребителе, а не там, где живёт реализация. Тесты табличные с t.Run, в CI go test -race на каждый pull request, линт через golangci-lint с коротким списком линтеров. Ещё тут graceful shutdown по SIGTERM, явные таймауты на http.Server и http.Client, эндпоинты /healthz и /readyz, отказ от глобального состояния и init с побочными эффектами. Горутины запускаются только с понятным владельцем и условием остановки, группы — через errgroup. Сборка — статический бинарник в distroless-образ многоступенчатым Dockerfile. Дженерики — лишь когда убирают настоящее дублирование.
Какие задачи решает
- выбрать роутер и структуру пакетов для нового Go-сервиса
- привести обработку ошибок к единому виду через
%wиerrors.Is - настроить JSON-логи с request ID вместо
fmt.Println - добавить graceful shutdown и таймауты серверу перед выкладкой
- убрать глобальное состояние и
initс побочными эффектами из кода
Примеры запросов агенту
- Напиши на Go сервис заказов: роутер из стандартной библиотеки, раскладка
cmd/orders/main.goиinternal/, конфиг из переменных окружения. - Отрефактори этот файл: оберни ошибки через
%w, замени логгер наlog/slogв JSON с request ID. - Добавь graceful shutdown по SIGTERM и таймауты на
http.Server, плюс/healthzи/readyz.
Как установить Go Service taste
Как использовать
Вставьте текст в начало диалога или в инструкции проекта
Вручную: положить файлы
.claude/commands/prompts.csv.mdВопросы о Go Service taste
Как установить Go Service taste в Claude?
У промпта нет команды установки: его текст добавляют в чат или в инструкции проекта. В Claude он лежит файлом .claude/commands/prompts.csv.md.
Что делает Go Service taste?
Задаёт агенту набор правил для Go-бэкенда: стандартный роутер, структура cmd/ и internal/, обёртка ошибок, log/slog, pgx с sqlc, табличные тесты и graceful shutdown.
Обязательно ли следовать всем пунктам?
У каждого правила указана уверенность от 0.70 до 0.95. Самые спорные — дженерики и sqlc вместо ORM; на небольшом сервисе их стоит обсудить с агентом отдельно.
Исходный текст
prompts.csv · CC0-1.0
# Go service taste of a backend engineer - Use the standard library net/http router from Go 1.22 before reaching for a framework. Confidence: 0.85 - Lay the project out as cmd/<service>/main.go plus internal/ packages, and skip pkg/. Confidence: 0.80 - Keep main.go thin: read config, wire dependencies and start the server. Confidence: 0.90 - Pass context.Context as the first argument to every function that does I/O. Confidence: 0.95 - Wrap errors with fmt.Errorf and %w, and check them with errors.Is and errors.As. Confidence: 0.95 - Log with log/slog in JSON format and include a request ID on every line. Confidence: 0.90 - Read configuration from environment variables into one typed struct at startup. Confidence: 0.85 - Fail fast at startup when required configuration is missing. Confidence: 0.90 - Write SQL by hand and generate typed code with sqlc instead of using an ORM. Confidence: 0.80 - Use pgx as the Postgres driver with a connection pool. Confidence: 0.85 - Define small interfaces in the package that consumes them, not the one that implements them. Confidence: 0.85 - Use table-driven tests with t.Run subtests. Confidence: 0.90 - Run go test with -race in CI on every pull request. Confidence: 0.90 - Lint with golangci-lint using a short, curated list of linters. Confidence: 0.80 - Shut down gracefully on SIGTERM with signal.NotifyContext and server.Shutdown. Confidence: 0.90 - Set explicit read, write and idle timeouts on every http.Server and http.Client. Confidence: 0.90 - Expose /healthz for liveness and /readyz for readiness. Confidence: 0.85 - Avoid global state and package-level init functions with side effects. Confidence: 0.85 - Start goroutines only with a clear owner and stop condition, using errgroup for groups. Confidence: 0.85 - Build a static binary into a distroless image with a multi-stage Dockerfile. Confidence: 0.80 - Add generics only when they remove real duplication. Confidence: 0.70
© f · CC0-1.0 · f/prompts.chat