В коде неверная начальная длина корзины, несинхронизированный Add и отсутствует return в Remove. Удаление во время range также может пропустить элементы или выйти за границы.
var (
В коде неверная начальная длина корзины, несинхронизированный 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 нежелателен для денег.