Что такое папка `pkg` в Go-проекте и для чего она используется?

Ответ

Папка pkg (сокращение от package) в Go-проекте — это общепринятая директория для хранения библиотечного кода, который может быть использован другими проектами или внутри самого проекта. Она предназначена для размещения кода, не относящегося напрямую к бизнес-логике приложения, но предоставляющего общие утилиты, хелперы, клиенты API, общие структуры данных и т.д.

Пример типичной структуры Go-проекта с pkg:

project/  
├── cmd/             # Точки входа для исполняемых приложений
│   └── app/         # Например, main.go для основного приложения
├── pkg/             # Общедоступный библиотечный код
│   ├── utils/       # Вспомогательные функции
│   ├── client/      # Клиенты для внешних API
│   └── storage/     # Абстракции для работы с хранилищами данных
├── internal/        # Код, доступный только внутри текущего проекта
│   └── service/     # Внутренняя бизнес-логика
├── api/             # Определения API (например, Protobuf, OpenAPI)
├── web/             # Статические файлы, шаблоны (для веб-приложений)
├── go.mod           # Модуль Go
└── README.md

Важные моменты:

  • Назначение: Код в pkg должен быть достаточно универсальным и переиспользуемым. Он может быть импортирован любым другим пакетом в вашем проекте или даже внешними проектами, если ваш модуль опубликован.
  • Отличие от internal: Директория internal содержит код, который может быть импортирован только пакетами внутри текущего модуля. Это обеспечивает строгую инкапсуляцию внутренней логики. В то время как pkg предназначен для публичного использования.
  • Необязательность: Использование pkg не является обязательным требованием Go, но это широко принятая конвенция, которая помогает структурировать крупные проекты и делает их более понятными для других разработчиков.
  • Документация: Поскольку код в pkg потенциально может использоваться внешними потребителями, он должен быть хорошо документирован и иметь четко определенные интерфейсы.