Tracks
/
Go
Go
/
Übungen
/
Lebensmittelladen
Lebensmittelladen

Lebensmittelladen

Lernübung

Einführung

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

Anleitung

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

1. Speichere die Maßeinheit in deinem Programm

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)

2. Erstelle eine neue Kundenrechnung

Du musst eine Funktion implementieren, die eine neue (leere) Rechnung für den Kunden erstellt.

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

3. Füge einen Artikel zur Kundenrechnung hinzu

Dafür musst du Folgendes tun:

  • Gib false zurück, wenn die angegebene unit nicht in der units-Map enthalten ist.
  • Andernfalls füge den Artikel der bill des Kunden hinzu, mit dem Artikelnamen als Schlüssel, und gib dann true zurück.
  • Wenn der Artikel bereits in der Rechnung vorhanden ist, erhöhe seine Menge um den Betrag, der zur angegebenen 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 bool ist.

4. Entferne einen Artikel aus der Kundenrechnung

Dafür musst du Folgendes tun:

  • Gib false zurück, wenn der angegebene Artikel nicht in der Rechnung ist
  • Gib false zurück, wenn die angegebene unit nicht in der units-Map enthalten ist.
  • Gib false zurück, wenn die neue Menge kleiner als 0 wäre.
  • Wenn die neue Menge 0 ist, entferne den Artikel vollständig aus der bill und gib dann true zurück.
  • Andernfalls reduziere die Menge des Artikels und gib 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 bool ist.

5. Gib die Menge eines bestimmten Artikels in der Kundenrechnung zurück

Dafür musst du Folgendes tun:

  • Gib 0 und false zurück, wenn der item nicht in der Rechnung ist.
  • Andernfalls gib die Menge des Artikels in der 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 int und bool haben.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Go Exercism

Bereit, mit Lebensmittelladen zu starten?

Melde dich bei Exercism an, um Go mit 34 Konzepte165 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.