Zusammenfassung – Zeiger verstehen
Teil des Abschnitts Grundlagen der GO-Journey von Coddy — Lektion 66 von 109.
Aufgabe
MittelIn dieser Herausforderung erstellen Sie ein einfaches Inventarverwaltungssystem für ein kleines Geschäft. Sie verwenden Pointer, um Inventarmengen zu aktualisieren, Werte zu berechnen und Änderungen zu verfolgen.
Vervollständigen Sie die drei folgenden Funktionen:
-
updateQuantity(quantity *int, change int) (int, bool)
Ändern Sie den Wert beiquantity, indem Siechangeaddieren (negativ für Verkäufe, positiv für Nachfüllungen).
Wenn das Ergebnis unter0fallen würde, setzen Sie*quantitystattdessen auf0.
Geben Sie die neue Menge und einen booleschen Wert zurück, dertrueist, wenn der Artikel nun nicht mehr vorrätig ist (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
Berechnen SietotalValuealsfloat64(quantity) * price.
WenntotalValuegrößer als*highestValueist, aktualisieren Sie*highestValueund setzen Sie*mostValuableItemmithilfe der Pointer aufitemName.
Geben SietotalValuezurück. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
Geben Sie den Namen jedes Artikels, die Menge (vom Pointer dereferenziert) und den berechneten Wert mitfmt.Printfaus.
Format:Apples: 10 (Value: $5.00)— verwenden Sie%.2ffür Preise.
Die erwartete Ausgabe für das Anfangsinventar ist:
Initial Inventory: Apples: 10 (Value: $5.00) Oranges: 15 (Value: $10.50) Bananas: 8 (Value: $2.40) Total inventory value: $17.90 Most valuable item: Oranges
Tipp: Verwenden Sie *quantity, um den Wert zu lesen oder zu schreiben, auf den ein Pointer zeigt. Zum Beispiel ändert *quantity += change die ursprüngliche Variable direkt.
Probier es selbst
package main
import "fmt"
// updateQuantity aktualisiert die Menge eines Artikels und gibt die neue Menge zurück
// sowie die Information, ob der Artikel ausverkauft ist (Menge = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Den Mengen-Pointer aktualisieren und den neuen Wert sowie den Ausverkauft-Status zurückgeben
return 0, false
}
// calculateValue berechnet den Gesamtwert eines Artikels basierend auf Menge und Preis
// Zudem wird mostValuableItem aktualisiert, falls dieser Artikel wertvoller ist
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Gesamtwert berechnen, bei Bedarf mostValuableItem aktualisieren und den Gesamtwert zurückgeben
return 0.0
}
// displayInventory gibt die Details des Inventars aus
// Verwendet Pointer, damit die Funktion Echtzeitdaten anzeigen kann
func displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64) {
fmt.Printf("Apples: %d (Value: $%.2f)\n", *apples, float64(*apples) * applePrice)
fmt.Printf("Oranges: %d (Value: $%.2f)\n", *oranges, float64(*oranges) * orangePrice)
fmt.Printf("Bananas: %d (Value: $%.2f)\n", *bananas, float64(*bananas) * bananaPrice)
}
func main() {
// Inventar initialisieren
apples := 10
oranges := 15
bananas := 8
// Preise
applePrice := 0.5 // 0,50 $ pro Stück
orangePrice := 0.7 // 0,70 $ pro Stück
bananaPrice := 0.3 // 0,30 $ pro Stück
// Den wertvollsten Artikel verfolgen
var mostValuableItem string
var highestValue float64
// Anfängliches Inventar anzeigen
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Anfangswerte berechnen und den wertvollsten Artikel finden
appleValue := calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue := calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue := calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// Einige Verkäufe simulieren
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // 4 Äpfel verkaufen
_, orangesOutOfStock := updateQuantity(&oranges, -8) // 8 Orangen verkaufen
_, bananasOutOfStock := updateQuantity(&bananas, -10) // Versuchen, 10 Bananen zu verkaufen (mehr als vorhanden)
// Prüfen, ob Artikel ausverkauft sind
if applesOutOfStock {
fmt.Println("Apples are out of stock!")
}
if orangesOutOfStock {
fmt.Println("Oranges are out of stock!")
}
if bananasOutOfStock {
fmt.Println("Bananas are out of stock!")
}
// Aktualisiertes Inventar anzeigen
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Tracking des wertvollsten Artikels für Neuberechnung zurücksetzen
mostValuableItem = ""
highestValue = 0
// Werte neu berechnen
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// Artikel aufstocken
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // 5 Äpfel hinzufügen
updateQuantity(&oranges, 10) // 10 Orangen hinzufügen
updateQuantity(&bananas, 12) // 12 Bananen hinzufügen
// Finales Inventar anzeigen
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Tracking des wertvollsten Artikels für finale Berechnung zurücksetzen
mostValuableItem = ""
highestValue = 0
// Finale Wertberechnung
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n", mostValuableItem)
}Alle Lektionen in Grundlagen
4Vergleichs- & logische Operatoren
Vergleichsoperatoren - Teil 1Vergleichsoperatoren - Teil 2Logischer UND-OperatorLogischer ODER-OperatorLogischer NICHT-OperatorGrundlagen der OperatorrangfolgeZusammenfassung - Vergleiche anstellen7Kontrollfluss: Schleifen
Die `for`-Schleife erklärtfor-Schleife - Grundlagenfor-Schleife - Nur BedingungDas `break`-SchlüsselwortDas `continue`-SchlüsselwortVerschachtelte SchleifenZusammenfassung - Aktionen wiederholen2Variablen und grundlegende Datentypen
Was ist eine VariableTypinferenz mit `:=`Ganzzahlen (int)GleitkommazahlenBoolesche WerteStringsZero ValuesKonstantenNamenskonventionenZusammenfassung - Variablen und Typen5Grundlagen der Ein- und Ausgabe
Formatierte AusgabeFormat-VerbenTypen ausgebenEinfache Benutzereingaben erhaltenZusammenfassung – Ein- und Ausgabe8Funktionen
Funktionen verstehenEine Funktion deklarierenFunktionen aufrufenFunktionsparameterEinen einzelnen Wert zurückgebenMehrere Werte zurückgebenBenannte RückgabewerteGrundlagen des Funktions-ScopesZusammenfassung – Wiederverwendbaren Code erstellen3Grundlegende Operatoren
Arithmetische OperatorenDivisionsoperatorDer Modulo-OperatorZuweisungsoperatorKombinierte ZuweisungsoperatorenInkrement und DekrementZusammenfassung - Berechnungen6Kontrollfluss: Bedingte Anweisungen
Die `if`-AnweisungDas `else`-SchlüsselwortDas `else if`-SchlüsselwortVariable Shadowing in `if`Variablen initialisierenDie `switch`-AnweisungSwitch mit AusdrückenSwitch ohne AusdruckDas `fallthrough`-SchlüsselwortZusammenfassung – Entscheidungen treffen9Zeiger
Was ist ein Zeiger?Deklarieren von ZeigervariablenDer AdressoperatorDereferenzieren von ZeigernVerwendung von Zeigern in FunktionenNil-ZeigerZusammenfassung – Zeiger verstehen12Zusammengesetzte Typen: Maps
Einführung in MapsDeklarieren von Map-LiteralenErstellen von Maps mit `make`Hinzufügen und Aktualisieren von Key-Value-PaarenZugriff auf Map-WerteÜberprüfen der Existenz von SchlüsselnLöschen von Map-EinträgenMap-LängeIterieren über MapsZusammenfassung – Key-Value-Speicher