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Übe selbstständig: Online-Go-Compiler