Skip to content

Instantly share code, notes, and snippets.

@sergey-shambir
Last active August 14, 2025 15:09
Show Gist options
  • Select an option

  • Save sergey-shambir/a0a1765072d85a69c7f529ae0c50026b to your computer and use it in GitHub Desktop.

Select an option

Save sergey-shambir/a0a1765072d85a69c7f529ae0c50026b to your computer and use it in GitHub Desktop.
Golang — именование и структура каталогов/пакетов/модулей

Идиоматичное именование

  1. Имя пакета является частью полного имени, это часто используется в именовании
    • courses.Course — курс
    • courses.Module — модуль курса
    • auth.Token — токен аутентификации
    • такой способ именования обыгрывается в стандартной библиотеке Go, пример: https://pkg.go.dev/slices
  2. Интерфейсы не имеют префикса
    • можно обыграть правило экспорта имён, начинающихся с заглавной буквы, например: интерфейс Module и его реализация module в пакете auth
    • можно расположить интерфейс и реализацию в разных пакетах, например: интерфейс domain.UserRepository и реализация infra.UserRepository
    • можно добавить префикс/суффикс к реализации, например: интерфейс AuthService, реализация AuthServiceImpl, декоратор LoggingAuthService
    • можно добавить конкретизацию в имя, например: интерфейс RateLimiter и реализация RedisRateLimiter
    • можно назвать интерфейс иначе, например: интерфейс Bookable и его реализация Room
  3. Длинные имена не приветствуются, а общепринятые сокращения — норма
    • пример: пакет auth вместо authentication
    • пример: Migrate() вместо RunDatabaseMigrations()
  4. Функции-конструкторы обычно называются New...
    • пример: func courses.New() *courses.Course
    • пример: func courses.NewModule() *courses.Module
    • пример: func auth.NewLearner() *auth.User

Связанные рекомендации:

  • Функции принимают интерфейсы, возвращают конкретные типы, или "не возвращайте интерфейс из функции"

Структура каталогов

Модульный вариант

Ниже показана возможная структуры каталогов для модульного сервиса (на примере академической LMS для ВУЗов):

  1. Слой Application — основной пакет модуля, например modules/auth
  2. Слой Domain — вложенный пакет модуля, например modules/auth/domain
  3. Слой Infrastructure (Data Access) — вложенный пакет модуля, например modules/auth/infra
  4. Слой Presentation — находится вне модулей в internal/ и поделён по точкам входа / клиентам, например: internal/restapi
  5. Один исполняемый файл на сервис — cmd/main.go
  6. Общая библиотека — в каталоге 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment