Когда ты только начинаешь писать на 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.