Когда ты только начинаешь писать на Go, структура проекта может быть простой: один файл main.go
и, может быть, ещё парочка. Но по мере роста проекта, добавления зависимостей, конфигураций и тестов, важно организовать код так, чтобы его было легко поддерживать и развивать.
Сообщество Go не навязывает жёстких стандартов, но существует рекомендованная структура, описанная в репозитории golang-standards/project-layout. Она используется многими командами в индустрии и даёт хорошую основу для любого проекта.
Давай подробно разберём основные директории и файлы.
🏗 Основные каталоги
cmd/
Здесь лежат входные точки твоих приложений.
Каждое приложение в проекте — это отдельная папка внутри cmd/
.
📁 Пример:
cmd/
myapp/
main.go
worker/
main.go
Каждый подкаталог содержит main.go
, который и есть точка входа.
internal/
Код, доступный только внутри этого проекта.
Go не позволит импортировать пакеты из internal
в других проектах.
📁 Пример:
internal/
auth/
service.go
db/
connection.go
Используется для бизнес-логики, которую не стоит переиспользовать вне проекта.
pkg/
Публичные библиотеки, которые могут использоваться другими проектами. Если ты разрабатываешь пакеты, которые потенциально могут быть переиспользованы — клади их сюда.
📁 Пример:
pkg/
logger/
logger.go
metrics/
prometheus.go
api/
Описание API-интерфейсов: Swagger, Protobuf, JSON Schema и т.п.
📁 Пример:
api/
proto/
user.proto
openapi/
swagger.yaml
configs/
Файлы конфигурации, которые используются при запуске.
Например: .yaml
, .json
, .env
и т.п.
📁 Пример:
configs/
config.yaml
deploy/
Инфраструктурный код: Dockerfile, Kubernetes манифесты, скрипты CI/CD.
📁 Пример:
deploy/
docker/
Dockerfile
k8s/
deployment.yaml
test/
Дополнительные тестовые сценарии и утилиты. Не обязательный каталог, но удобен для end-to-end тестов или фреймворков.
📁 Пример полной структуры
myproject/
├── cmd/
│ └── myapp/
│ └── main.go
├── internal/
│ └── service/
│ └── logic.go
├── pkg/
│ └── utils/
│ └── helper.go
├── api/
│ └── openapi/
│ └── swagger.yaml
├── configs/
│ └── config.yaml
├── deploy/
│ └── docker/
│ └── Dockerfile
├── go.mod
├── go.sum
└── README.md
✅ Зачем всё это?
- Прозрачность: Новому разработчику легче разобраться в коде.
- Масштабируемость: Проект может расти без хаоса.
- Разделение ответственности: У каждого слоя — своя зона.
- Совместимость с инструментами: Большинство тулов Go ожидают подобную структуру.
🔍 Заключение
Структура проекта — не догма, но хорошая структура экономит десятки часов.
Следуй рекомендациям project-layout
— и твой проект будет понятен и тебе, и другим.
Если проект совсем маленький — можно начать с простого, но будь готов к переходу на структурированный подход, когда код начнёт разрастаться.
Следующая глава: Управление зависимостями с помощью go mod
и go get
.