--- name: go-standards description: Используй при написании, ревью и проверке кода на Go в наших сервисах — структура сервиса, запуск линтеров и тестов, формат коммитов и merge request. Применяй всегда, когда пишешь или правишь Go-код, готовишь MR, а также в командах /bugfix, /feature и /review. --- # Стандарты Go Наш основной стек — **Go**. Скилл описывает, как писать, проверять и оформлять код. Реалистичные общепринятые дефолты приведены ниже; то, что специфично для компании, заполнено дефолтами индустрии — тюним под M.Video позже. ## Структура сервиса Ориентир (уточняется под компанию): ``` cmd//main.go # точка входа internal/ # приватный код сервиса / # доменные пакеты pkg/ # переиспользуемый публичный код (если есть) api/ # спецификации API (proto/openapi) ``` > Ориентир по индустрии: `cmd/` + `internal/` + `pkg/`. Эталон под M.Video уточним позже. ## Линтеры - Форматирование: `gofmt -l -w .` и `goimports -w .` — код должен быть отформатирован. - Статический анализ: `go vet ./...`. - Основной линтер: **golangci-lint** — `golangci-lint run ./...`. Набор линтеров задаётся в `.golangci.yml` в корне репозитория. Базовый набор: `govet`, `staticcheck`, `errcheck`, `ineffassign`, `gosimple`, `unused`. Корпоративный `.golangci.yml` добавим позже. ## Тесты - Прогон всех тестов: `go test ./...`. - С гонками и покрытием: `go test -race -cover ./...`. - Покрытие: мягкий ориентир ~70%+ для бизнес-логики, критичные пути — обязательно; интеграционные тесты для внешних зависимостей. (пороги уточним) - Именование: `TestXxx`, табличные тесты приветствуются. ## Коммиты и MR - **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …). - **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета). Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**. Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит. - **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые ветки запрещён — расширение `permission-gate` дополнительно переспросит. - **Описание MR:** что и зачем изменено, как проверено (линтеры + тесты), ссылка на тикет (см. скилл `jira-workflow`). - Перед MR прогони линтеры и тесты — всё должно быть зелёным. ## Чек-лист перед MR - [ ] `gofmt`/`goimports` без изменений - [ ] `go vet ./...` чисто - [ ] `golangci-lint run ./...` чисто - [ ] `go test ./...` (или `-race`) зелёные - [ ] есть тесты на новую логику / фикс - [ ] нет секретов и закоммиченных `.env` - [ ] описание MR со ссылкой на тикет