Треки
/
Go
Go
/
Вправи
/
Оптовий магазин
Оптовий магазин

Оптовий магазин

Навчальна вправа

Вступ

У Go map є вбудованим типом даних, який зіставляє ключі зі значеннями. В інших мовах програмування ця концепція map може бути знайома нам як словник, хеш-таблиця, сховище ключ-значення або асоціативний масив.

Синтаксично map має такий вигляд:

map[KeyType]ElementType

Також важливо знати, що кожен ключ унікальний, тобто якщо присвоїти той самий ключ двічі, значення відповідного ключа буде перезаписано.

Щоб створити map, можна зробити так:

  // With map literal
  foo := map[string]int{}

або

  // or with make function
  foo := make(map[string]int)

Ось деякі операції, які можна виконувати з map

  // Add a value in a map with the `=` operator:
  foo["bar"] = 42
  // Here we update the element of `bar`
  foo["bar"] = 73
  // To retrieve a map value, you can use
  baz := foo["bar"]
  // To delete an item from a map, you can use
  delete(foo, "bar")

Якщо ми спробуємо отримати значення для ключа, якого немає в map, повернеться нульове значення для цього типу. Це може заплутати нас, особливо якщо типове значення нашого ElementType (наприклад, 0 для int) є припустимим значенням. Щоб перевірити, чи існує ключ у map, можна використати

  value, exists := foo["baz"]
  // If the key "baz" does not exist,
  // value: 0; exists: false

Вказівки

У нашого друга є стара оптова крамниця під назвою Gross Store. Назва походить від одиниці, у якій крамниця продає товар: усе вимірюється в гросах. Друг попросив нас створити для його крамниці систему продажів (POS). Спочатку створимо для неї прототип. У прототипі система буде лише записувати кількість. Друг дав нам список мір, які допоможуть:

Одиниця Значення
quarter_of_a_dozen 3
half_of_a_dozen 6
dozen 12
small_gross 120
gross 144
great_gross 1728

1. Збережіть одиницю вимірювання у своїй програмі

Щоб скористатися мірою, потрібно зберегти її в програмі.

units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)

2. Створіть новий рахунок клієнта

Потрібно реалізувати функцію, яка створює новий (порожній) рахунок для клієнта.

bill := NewBill()
fmt.Println(bill)
// Output: map[]

3. Додайте товар до рахунку клієнта

Щоб це реалізувати, потрібно:

  • Повернути false, якщо значення unit відсутнє в мапі units.
  • Інакше додати товар до bill клієнта за ключем-назвою товару, а потім повернути true.
  • Якщо товар уже є в рахунку, збільшити його кількість на величину, що відповідає переданому unit.
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

Зверніть увагу, що повернене значення має тип bool.

4. Видаліть товар із рахунку клієнта

Щоб це реалізувати, потрібно:

  • Повернути false, якщо переданого товару немає в рахунку
  • Повернути false, якщо значення unit відсутнє в мапі units.
  • Повернути false, якщо нова кількість була б меншою за 0.
  • Якщо нова кількість дорівнює 0, повністю видалити товар із bill, а потім повернути true.
  • Інакше зменшити кількість товару і повернути true.
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

Зверніть увагу, що повернене значення має тип bool.

5. Поверніть кількість конкретного товару з рахунку клієнта

Щоб це реалізувати, потрібно:

  • Повернути 0 і false, якщо item немає в рахунку.
  • Інакше повернути кількість товару в bill і true.
bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true

Зверніть увагу, що повернені значення мають типи int і bool.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Go Exercism

Час розпочати Оптовий магазин?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Go, а також 34 концепції165 вправ та справжнє наставництво від людей, і все це безкоштовно.