In Go ist map ein eingebauter Datentyp, der Schlüssel auf Werte abbildet.
In anderen Programmiersprachen kennst du das Konzept von map vielleicht als Wörterbuch, Hash-Tabelle, Schlüssel-Wert-Speicher oder assoziatives Array.
Syntaktisch sieht map so aus:
map[KeyType]ElementType
Wichtig ist auch, dass jeder Schlüssel eindeutig ist: Wenn du denselben Schlüssel zweimal zuweist, wird der Wert des entsprechenden Schlüssels überschrieben.
Um eine Map zu erstellen, kannst du Folgendes tun:
// With map literal
foo := map[string]int{}
oder
// or with make function
foo := make(map[string]int)
Hier sind einige Operationen, die du mit einer Map ausführen kannst
// 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")
Wenn du versuchst, den Wert für einen Schlüssel abzurufen, der nicht in der Map existiert, wird der Nullwert des Werttyps zurückgegeben.
Das kann verwirrend sein, besonders wenn der Standardwert deines ElementType (zum Beispiel 0 für ein int) ein gültiger Wert ist.
Um zu prüfen, ob ein Schlüssel in deiner Map existiert, kannst du Folgendes verwenden
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
Ein Freund von dir hat einen alten Großhandel namens Gross Store. Der Name kommt daher, dass der Laden seine Waren in Gros-Einheiten verkauft. Dein Freund hat dich gebeten, für seinen Laden ein Kassensystem (POS) zu entwickeln. Zuerst möchtest du einen Prototyp dafür bauen. In deinem Prototyp erfasst dein System nur die Menge. Dein Freund hat dir eine Liste mit Maßeinheiten gegeben, die dir helfen soll:
| Einheit | Wert |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
Um die Maßeinheit verwenden zu können, musst du sie in deinem Programm speichern.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Du musst eine Funktion implementieren, die eine neue (leere) Rechnung für den Kunden erstellt.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Dafür musst du Folgendes tun:
false zurück, wenn die angegebene unit nicht in der units-Map enthalten ist.bill des Kunden hinzu, mit dem Artikelnamen als Schlüssel, und gib dann true zurück.unit gehört.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
Beachte, dass der Rückgabewert vom Typ
boolist.
Dafür musst du Folgendes tun:
false zurück, wenn der angegebene Artikel nicht in der Rechnung istfalse zurück, wenn die angegebene unit nicht in der units-Map enthalten ist.false zurück, wenn die neue Menge kleiner als 0 wäre.bill und gib dann true zurück.true zurück.bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)
Beachte, dass der Rückgabewert vom Typ
boolist.
Dafür musst du Folgendes tun:
0 und false zurück, wenn der item nicht in der Rechnung ist.bill und true zurück.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
Beachte, dass die Rückgabewerte die Typen
intundboolhaben.
Melde dich bei Exercism an, um Go mit 34 Konzepte165 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.