var (

В коде неверная начальная длина корзины, несинхронизированный Add и отсутствует return в Remove. Удаление во время range также может пропустить элементы или выйти за границы.

Короткий ответ

Что ответить на собеседовании

В коде неверная начальная длина корзины, несинхронизированный Add и отсутствует return в Remove. Удаление во время range также может пропустить элементы или выйти за границы.

Подробный разбор

Ответ с пояснениями

Условие

var ( mu sync.Mutex items []Product vatRate = 10.0 order Order )

type Product struct { NameOfProduct string PriceOfProduct float32 }

type Order struct { Items []Product }

func init() { items = make([]Product, 100) }

func AddItemToShoppingCart(item Product) { items = append(items, item) }

func RemoveItemFromShoppingCart(nameOfItem string) bool { mu.Lock() defer mu.Unlock()

for i, item := range items {
	if item.NameOfProduct == nameOfItem {
		items = append(items[:i], items[i+1:]...)
	}
}

}

Ответ

В коде неверная начальная длина корзины, несинхронизированный Add и отсутствует return в Remove. Удаление во время range также может пропустить элементы или выйти за границы.

Для удаления первого совпадения:

func init() { items = make([]Product, 0, 100) }

func AddItemToShoppingCart(item Product) {
    mu.Lock()
    defer mu.Unlock()
    items = append(items, item)
}

func RemoveItemFromShoppingCart(name string) bool {
    mu.Lock()
    defer mu.Unlock()
    for i := range items {
        if items[i].NameOfProduct == name {
            copy(items[i:], items[i+1:])
            items[len(items)-1] = Product{}
            items = items[:len(items)-1]
            return true
        }
    }
    return false
}

Все чтения также должны соблюдать синхронизацию. Если нужно удалять все совпадения, контракт иной. Для нескольких пользователей нельзя хранить единственную глобальную корзину, а float32 нежелателен для денег.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее