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