У 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 |
Щоб скористатися мірою, потрібно зберегти її в програмі.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Потрібно реалізувати функцію, яка створює новий (порожній) рахунок для клієнта.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Щоб це реалізувати, потрібно:
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.
Щоб це реалізувати, потрібно:
false, якщо переданого товару немає в рахункуfalse, якщо значення unit відсутнє в мапі units.false, якщо нова кількість була б меншою за 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.
Щоб це реалізувати, потрібно:
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.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Go, а також 34 концепції165 вправ та справжнє наставництво від людей, і все це безкоштовно.