Go · 45 строк
Reserve вызывается при оформлении заказа, ReserveCart — для корзины из нескольких товаров. В распродажу по одному SKU приходит до 400 заказов в секунду.
Отметьте строки с ошибками.
В работе: Резервирование остатков при оформлении заказа.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на данных Ozon: склады и заказы. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package stockimport ("errors""sync")var ErrOutOfStock = errors.New("товара нет на складе")type Warehouse struct {mu sync.RWMutexstock map[string]int // SKU → свободный остаток}// Reserve резервирует qty штук под заказ покупателя.func (w *Warehouse) Reserve(sku string, qty int) error {w.mu.RLock()left := w.stock[sku]w.mu.RUnlock()if left < qty {return ErrOutOfStock}w.mu.Lock()w.stock[sku] = left - qtyw.mu.Unlock()return nil}// Release возвращает остаток при отмене заказа.func (w *Warehouse) Release(sku string, qty int) {w.mu.Lock()w.stock[sku] += qtyw.mu.Unlock()}func (w *Warehouse) ReserveCart(items map[string]int) error {for sku, qty := range items {if err := w.Reserve(sku, qty); err != nil {return err}}return nil}