- Имя пакета является частью полного имени, это часто используется в именовании
courses.Course— курсcourses.Module— модуль курсаauth.Token— токен аутентификации- такой способ именования обыгрывается в стандартной библиотеке Go, пример: https://pkg.go.dev/slices
- Интерфейсы не имеют префикса
- можно обыграть правило экспорта имён, начинающихся с заглавной буквы, например: интерфейс
Moduleи его реализацияmoduleв пакетеauth - можно расположить интерфейс и реализацию в разных пакетах, например: интерфейс
domain.UserRepositoryи реализацияinfra.UserRepository - можно добавить префикс/суффикс к реализации, например: интерфейс
AuthService, реализацияAuthServiceImpl, декораторLoggingAuthService - можно добавить конкретизацию в имя, например: интерфейс
RateLimiterи реализацияRedisRateLimiter - можно назвать интерфейс иначе, например: интерфейс
Bookableи его реализацияRoom
- можно обыграть правило экспорта имён, начинающихся с заглавной буквы, например: интерфейс
- Длинные имена не приветствуются, а общепринятые сокращения — норма
- пример: пакет
authвместоauthentication - пример:
Migrate()вместоRunDatabaseMigrations()
- пример: пакет
- Функции-конструкторы обычно называются New...
- пример:
func courses.New() *courses.Course - пример:
func courses.NewModule() *courses.Module - пример:
func auth.NewLearner() *auth.User
- пример:
Связанные рекомендации:
- Функции принимают интерфейсы, возвращают конкретные типы, или "не возвращайте интерфейс из функции"
Ниже показана возможная структуры каталогов для модульного сервиса (на примере академической LMS для ВУЗов):
- Слой Application — основной пакет модуля, например
modules/auth - Слой Domain — вложенный пакет модуля, например
modules/auth/domain - Слой Infrastructure (Data Access) — вложенный пакет модуля, например
modules/auth/infra - Слой Presentation — находится вне модулей в
internal/и поделён по точкам входа / клиентам, например:internal/restapi - Один исполняемый файл на сервис —
cmd/main.go - Общая библиотека — в каталоге
pkg
Этот пример в целом идиоматичный, но не единственно верный и не общепринятый.
lmsbackend/ # Модульный сервис (Go)
├── bin/ # Бинарные файлы
│
├── cmd/ # Точка входа (main.go)
│
├── internal/ # Слой Presentation и общий фреймворк для запуска модулей
│ ├── restapi/ # Обработчики HTTP-запросов
│ ├── infra/ # Общий код подключения к Postges, Redis и т.д.
│ └── migrations/ # Функция запуска миграций
│
├── modules/ # Бизнес-модули
│ ├── auth/ # Модуль авторизации
│ │ ├── domain/ # Модели, абстракции, доменные сервисы
│ │ └── infra/ # Слой доступа к данным и прочих деталей
│ │
│ ├── courses/ # Модуль курсов
│ │ ├── domain/
│ │ └── infra/
│ │
│ ├── articles/ # Модуль статей
│ │ ├── domain/
│ │ └── infra/
│ │
│ ├── assignments/ # Модуль заданий
│ │ ├── domain/
│ │ └── infra/
│ │
│ └── mailing/ # Модуль работы с почтой (отправка по SMTP)
│ ├── domain/
│ └── infra/
│
├── pkg/ # Общая библиотека проекта
│ ├── app/
│ ├── domain/
│ └── infra/
│
├── migrations/ # Миграции базы данных (golang-migrate)
└── tests/ # Интеграционные тесты с TestContainers