Перейти к основному содержимому

Практика: Пакеты, модули и организация проекта


Онлайн редактор кода для Go

Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.


❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.

Задание 1 — Создание первого модуля и пакета

Задание 1: Первый модуль + утилитарный пакет

⏱️ Примерное время: 10-15 минут

Создай модуль `github.com/ваш-ник/cli-tool`. В пакете `pkg/utils` напиши 3–4 полезные функции (например, ToUpper, Reverse, Sum). В cmd/cli/main.go используй их.


Требования:

  • go mod init github.com/ваш-ник/cli-tool
  • структура: cmd/cli/main.go, pkg/utils/utils.go
  • функции в utils — экспортированные (заглавная буква)
  • в main: вызов 2–3 функций + вывод результата

Пример вывода:

Hello → HELLO
world → dlrow
Сумма: 42

Задание 2 — Многослойная структура: config + models

Задание 2: Многослойная структура проекта

⏱️ Примерное время: 20-25 минут

Создай модуль `github.com/ваш-ник/data-tool`. Организуй слои: internal/config, internal/models, pkg/utils. Загрузи конфиг из .env или JSON.


Требования:

  • структура:
    data-tool/
    ├── go.mod
    ├── internal/
    │ ├── config/
    │ │ └── config.go
    │ └── models/
    │ └── config.go
    ├── pkg/
    │ └── utils/
    │ └── utils.go
    ├── cmd/
    │ └── main/
    │ └── main.go
    └── .env.example
  • internal/config.Load() → читает .env или JSON
  • internal/models.Config — структура с полями
  • pkg/utils — 2–3 вспомогательные функции
  • в main: загрузка конфига + вывод значений

Пример вывода:

Загружен конфиг:
Database: postgres://user:pass@localhost:5432/db
LogLevel: debug
MaxWorkers: 10

Задание 3 — Приватный пакет internal/database

Задание 3: Приватный пакет internal/database

⏱️ Примерное время: 20-25 минут

В internal/database создай подключение к БД (имитация или in-memory map). Сделай его приватным (sync.Once). Экспортируй только GetDB().


Требования:

  • internal/database/db.govar db *SomeDB; once sync.Once
  • func Connect() error — инициализация
  • func GetDB() *SomeDB — экспортируется
  • в main: вызов Connect() → GetDB() → использование

Пример вывода:

Подключение к БД...
БД готова. Ключ "user" → "Artem"

Задание 4 — Пакет pkg/logger с init()

Задание 4: Пакет pkg/logger с init()

⏱️ Примерное время: 15-20 минут

Создай публичный пакет pkg/logger. В init() настрой slog с уровнем из ENV. Экспортируй функции Info, Warn, Error.


Требования:

  • pkg/logger/logger.go
  • func init() { ... slog.SetDefault(...) }
  • экспортируй func Info(msg string, args ...any)
  • в main: вызов логов разных уровней

Пример вывода:

2026-01-07T14:35:22Z INFO Приложение запущено app=my-tool
2026-01-07T14:35:23Z WARN Низкий заряд батареи percent=12

Задание 5 — Итоговое: CLI-утилита с многослойной структурой

Задание 5: Полноценная CLI-утилита (итоговое)

⏱️ Примерное время: 40-60 минут

Создай модуль `github.com/ваш-ник/data-cli`. Организуй слои: cmd/data-cli/main.go, internal/config, internal/models, internal/processor, pkg/utils, pkg/logger. Утилита читает файл, обрабатывает данные и выводит статистику.


Требования:

  • структура проекта как в лекции
  • internal/config → загрузка из .env или флагов
  • pkg/logger → slog с уровнем по флагу --debug
  • internal/processor → бизнес-логика обработки файла
  • pkg/utils → вспомогательные функции (чтение, парсинг)
  • main: парсинг флагов → загрузка конфига → обработка → вывод

Пример запуска:

go run ./cmd/data-cli --file data.csv --word error --debug

Пример вывода:

level=INFO msg="Запуск утилиты" version=0.1.0 debug=true
Файл: data.csv
Строк: 1500
Слов: 12450
Уникальных: 3840

Это задание — полноценная CLI-утилита с production-ready структурой.

подсказка

Хорошая структура проекта — это когда через год ты открываешь код и сразу понимаешь, где что лежит.
internal/ для приватного кода, pkg/ для переиспользуемого, cmd/ для точек входа — стандарт де-факто в 2026 году.