Квота загрузки на Go: проверка лимита без переполнения int64

Практическая задача на Go по теме «Проверяем расчёт лимита загрузок». Условие содержит контракт функций, предоставленные типы и требования к результату. Используйте выданный шаблон и сохраняйте его публичные объявления. Перед проверкой разберите успешный путь, обработку ошибок и отмену операции, когда она предусмотрена контрактом. Здесь оценивается конкретный компонент сервиса; в полном курсе микросервисов на Go эти компоненты связываются с HTTP, PostgreSQL, gRPC и Kafka.

Задача

Реализуйте тело функции AllowUpload, которая решает, можно ли загрузить файл заданного размера, не превысив квоту пользователя.

Типы и сигнатура

type Quota struct {
    Used  int64
    Limit int64
}

func AllowUpload(q Quota, bytes int64) (Quota, bool)

Поле Used — уже занятое место в байтах, Limit — максимально допустимый объём. Оба измеряются в байтах как int64; никакого округления или преобразования единиц не требуется.

Контракт

  • Валидное состояние квоты: 0 <= q.Used <= q.Limit. Если условие нарушено — отказ.
  • Валидный запрос: bytes > 0. Ноль и отрицательные значения — отказ.
  • Достаточно места: bytes <= q.Limit - q.Used — разрешить загрузку.
  • При успехе вернуть Quota{Used: q.Used + bytes, Limit: q.Limit}, true.
  • При отказе вернуть исходную q без каких-либо изменений и false. Частичное обновление недопустимо.

Порядок проверок важен

Сначала убедитесь в валидности состояния и знака bytes, только затем вычислите остаток q.Limit - q.Used и сравните его с bytes. Прибавляйте bytes к Used лишь после того, как все проверки пройдены. Это исключает переполнение int64: если состояние валидно, разность гарантированно неотрицательна и не выходит за диапазон.

Примеры

  • Quota{Used:7, Limit:10}, bytes=3 → Quota{Used:10, Limit:10}, true — ровно вписывается в лимит.
  • Quota{Used:7, Limit:10}, bytes=4 → Quota{Used:7, Limit:10}, false — места не хватает.
  • Quota{Used: math.MaxInt64-1, Limit: math.MaxInt64}, bytes=1 → успех; bytes=2 → исходная квота и false, поскольку свободен лишь 1 байт.

Допишите только тело AllowUpload; тип Quota уже предоставлен.

РешениеGo

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи