Lagerbestand prüfen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 46 von 68.
Aufgabe
EinfachImplementieren Sie eine Bestandsprüfungsfunktion für Ihr Inventarverwaltungssystem, die Produktmengen sicher abruft und Fälle behandelt, in denen Produkte nicht existieren. Diese Herausforderung baut auf der Inventar-Grundlage der vorherigen Lektion auf und fügt eine Fehlerbehandlung für Bestandsabfragen hinzu.
Sie erhalten zwei Eingaben:
- Einen String, der bestehende Inventardaten im Format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"enthält (z. B."Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Einen String, der Bestandsprüfungsanfragen im Format
"product1,product2,product3"enthält (z. B."Mouse,Tablet,Keyboard")
Ihre Aufgabe ist es:
- Verwenden Sie dieselbe
Product-Struktur aus der vorherigen Lektion mit den FeldernPrice(float64) undQuantity(int) - Parsen Sie die erste Eingabe, indem Sie sie an Kommas aufteilen, um einzelne Produkteinträge zu erhalten
- Teilen Sie für jeden Produkteintrag an Doppelpunkten auf, um Produktname, Preis und Menge zu erhalten
- Konvertieren Sie den Preis-String in float64 und den Mengen-String in int
- Erstellen und befüllen Sie die
inventory-Map mit den geparsten Produktdaten - Erstellen Sie eine Funktion namens
checkStock, die die inventory-Map und einen Produktnamen als Parameter entgegennimmt und (int, error) zurückgibt:- Wenn das Produkt im Inventar existiert, geben Sie seine Menge und nil zurück
- Wenn das Produkt nicht existiert, geben Sie 0 und einen Fehler mit der Nachricht
"product not found: [product_name]"zurück
- Parsen Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um die Liste der zu prüfenden Produkte zu erhalten
- Zeigen Sie die Kopfzeile für die Bestandsprüfung an:
"Stock Check Results:" - Rufen Sie für jedes Produkt in der Prüfliste die Funktion
checkStockauf und zeigen Sie die Ergebnisse an:- Wenn kein Fehler auftritt:
"[product_name]: [quantity] units in stock" - Bei Fehler:
"[product_name]: Error - [error_message]"
- Wenn kein Fehler auftritt:
- Zählen und zeigen Sie Zusammenfassungsstatistiken an:
"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]"
- Zeigen Sie den Gesamtbestand für gefundene Produkte an:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- Listen Sie alle fehlenden Produkte auf:
- Wenn Produkte fehlen:
"Missing products: [comma_separated_list_of_missing_products]" - Wenn keine Produkte fehlen:
"All requested products are available"
- Wenn Produkte fehlen:
Verwenden Sie das strings-Paket, um die Eingabestrings aufzuteilen, das strconv-Paket, um Strings in Zahlen umzuwandeln, das errors-Paket, um Fehlermeldungen zu erstellen, und das fmt-Paket für die formatierte Ausgabe. Diese Herausforderung zeigt, wie man einen sicheren Datenabruf mit ordnungsgemäßer Fehlerbehandlung implementiert, ein grundlegendes Muster in Inventarverwaltungssystemen.
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