Что такое папка `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 потенциально может использоваться внешними потребителями, он должен быть хорошо документирован и иметь четко определенные интерфейсы.

Ответ 18+ 🔞

А, слушай, вот эта папка pkg в гошечных проектах... Ну, это такая классика, блядь, как "Муму" у Тургенева — все знают, но не все понимают, зачем она нужна нахуй.

Представь себе, у тебя есть проект. Там же не только одна бизнес-логика, эта, сраная, которая деньги приносит. Есть ещё куча вспомогательного кода — утилитки, клиенты к каким-нибудь внешним сервисам, общие структуры данных. Вот эту всю хуйню, которую можно переиспользовать, и пихают в pkg. Это типа публичная библиотека внутри твоего же проекта.

Вот смотри на структуру, она обычно такая:

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

А теперь главное, чтобы не обосраться:

  • Зачем она? pkg — это как общий инструмент на стройке. Молоток, отвертка. Любой рабочий (cmd, internal, даже внешние проекты) может взять и использовать. Код там должен быть универсальным, ёбаный в рот переиспользуемым!
  • Чем не internal? Вот это важно, блядь! internal — это как комната с надписью "Посторонним В." Только код внутри этого же модуля может туда зайти. А pkg — это как холл гостиницы, заходи кто хочет. internal для секретов, pkg — для всего общего.
  • Обязательно ли? Да не, конечно! Go тебя за это не расстреляет. Но это, блядь, как неписанное правило, конвенция. Все большие и адекватные проекты так делают, потому что это сразу делает структуру понятной. Приходишь в проект, видишь pkg — ага, тут лежит что-то, что можно таскать.
  • Документация, сука! Раз уж ты выставляешь код на всеобщее обозрение в pkg, будь добр, задокументируй его, как следует! Чтоб другой разработчик, который это импортит, не гадал на кофейной гуще, что делает функция ParseShitAndDie. Пиши комментарии, описывай интерфейсы. Иначе получится пиздец, а не библиотека.

Короче, pkg — это твой публичный фасад, лицо проекта для других разработчиков. Сделай его красивым и удобным, а всю грязную кухню прячь в internal.