Lagerbestand prüfen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 46 von 68.
Aufgabe
EinfachImplementiere eine Funktion zur Bestandsprüfung für dein Bestandsverwaltungssystem, die Produktmengen sicher abruft und Fälle behandelt, in denen Produkte nicht existieren. Diese Herausforderung baut auf der Bestandsgrundlage aus der vorherigen Lektion auf und fügt eine Fehlerbehandlung für Bestandsabfragen hinzu.
Du erhältst zwei Eingaben:
- Eine Zeichenkette mit vorhandenen Bestandsdaten im Format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(z. B."Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Eine Zeichenkette mit Bestandsprüfanfragen im Format
"product1,product2,product3"(z. B."Mouse,Tablet,Keyboard")
Deine Aufgabe ist es:
- Dieselbe Struktur
Productwie in der vorherigen Lektion mit den FeldernPrice(float64) undQuantity(int) zu verwenden - Die erste Eingabe durch Aufteilen an Kommas zu analysieren, um einzelne Produkteinträge zu erhalten
- Jeden Produkteintrag an Doppelpunkten aufzuteilen, um Produktname, Preis und Menge zu erhalten
- Die Preiszeichenkette in float64 und die Mengenzeichenkette in int umzuwandeln
- Die Map
inventorymit den analysierten Produktdaten zu erstellen und zu füllen - Eine Funktion namens
checkStockzu erstellen, die die Bestands-Map und einen Produktnamen als Parameter übernimmt und (int, error) zurückgibt:- Wenn das Produkt im Bestand vorhanden ist, seine Menge und nil zurückzugeben
- Wenn das Produkt nicht vorhanden ist, 0 und einen Fehler mit der Nachricht
"product not found: [product_name]"zurückzugeben
- Die zweite Eingabe durch Aufteilen an Kommas zu analysieren, um die Liste der zu prüfenden Produkte zu erhalten
- Die Überschrift für die Bestandsprüfung anzuzeigen:
"Stock Check Results:" - Für jedes Produkt in der Prüfliste die Funktion
checkStockaufzurufen und die Ergebnisse anzuzeigen:- Wenn kein Fehler auftritt:
"[product_name]: [quantity] units in stock" - Bei einem Fehler:
"[product_name]: Error - [error_message]"
- Wenn kein Fehler auftritt:
- Zusammenfassungsstatistiken zu zählen und anzuzeigen:
"Check Summary:""Products checked: [total_number_of_products_checked]""Products found: [number_of_products_that_exist]""Products not found: [number_of_products_that_dont_exist]"
- Den Gesamtbestand der gefundenen Produkte anzuzeigen:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- Fehlende Produkte aufzulisten:
- Wenn fehlende Produkte vorhanden sind:
"Missing products: [comma_separated_list_of_missing_products]" - Wenn keine Produkte fehlen:
"All requested products are available"
- Wenn fehlende Produkte vorhanden sind:
Verwende das Paket strings, um die Eingabezeichenketten aufzuteilen, das Paket strconv, um Zeichenketten in Zahlen umzuwandeln, das Paket errors, um Fehlermeldungen zu erstellen, und das Paket fmt für die formatierte Ausgabe. Diese Herausforderung zeigt, wie ein sicherer Datenabruf mit einer geeigneten Fehlerbehandlung implementiert wird – ein grundlegendes Muster in Bestandsverwaltungssystemen.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
// Define the Product struct
type Product struct {
Price float64
Quantity int
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
storeInfo := scanner.Text()
scanner.Scan()
productData := scanner.Text()
// 1. Parse store information (split by comma)
storeInfoParts := strings.Split(storeInfo, ",")
storeName := ""
location := ""
if len(storeInfoParts) >= 2 {
storeName = storeInfoParts[0]
location = storeInfoParts[1]
}
// 2. Parse product data (split by comma, then by colon for each product)
productEntries := strings.Split(productData, ",")
// 3. Create inventory map
inventory := make(map[string]Product)
// 4. Convert strings to appropriate types and populate inventory
for _, entry := range productEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 3 {
productName := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[productName] = Product{
Price: price,
Quantity: quantity,
}
}
}
// 5. Display store information
fmt.Printf("=== %s Inventory System ===\n", storeName)
fmt.Printf("Location: %s\n", location)
fmt.Printf("Inventory initialized with %d products\n", len(inventory))
// 6. Display current inventory (sorted alphabetically)
fmt.Println("Current Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
}
// 7. Calculate and display inventory statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
fmt.Println("Inventory Statistics:")
fmt.Printf("Total Products: %d\n", totalProducts)
fmt.Printf("Total Items in Stock: %d\n", totalItems)
fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
// 8. Display system status
fmt.Println("System Status: Ready")
fmt.Println("Inventory management system initialized successfully")
}Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und VerhaltenÜbe selbstständig: Online-Go-Compiler