Практика: Пакеты, модули и организация проекта
Онлайн редактор кода для 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 или JSONinternal/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.go→var db *SomeDB; once sync.Oncefunc 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.gofunc 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 с уровнем по флагу --debuginternal/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 году.