Квота загрузки на 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: Принять только полный ответ о последней статье — задача с проверкой
- HTTP-клиент поиска на Go: обработка ответа и ошибок — задача
- Go: Декодирование артефакта из JSON — задача с проверкой
- Go: Обязательная и необязательная зависимость при отказе — задача с проверкой
- Go: HTTP-обработчик поиска задания через JobStore — задача с проверкой
- Go: HTTP-обработчик расчёта калорийности состава — задача с проверкой
