Alles zusammenfügen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 50 von 68.
Aufgabe
EinfachVervollständigen Sie Ihr Bestandsverwaltungssystem, indem Sie ein umfassendes Hauptprogramm erstellen, das alle Funktionen integriert, die Sie in den vorangegangenen Lektionen entwickelt haben. Diese abschließende Herausforderung führt die Bestandsinitialisierung, die Lagerprüfung, das Hinzufügen von Artikeln, Bestandsaktualisierungen und die Berichterstellung in einer vollständigen Befehlszeilenschnittstelle mit menügesteuerter Navigation zusammen.
Sie erhalten drei Eingaben:
- Einen String, der die initialen Bestandsdaten 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 eine Sequenz von Menüoperationen im Format
"operation1,operation2,operation3"enthält, wobei die Operationen"check","add","update","report"oder"exit"sein können (z. B."check,add,update,report,exit") - Einen String, der Operationsparameter im Format
"param1|param2|param3"enthält, wobei jeder Parameter der Operation an der gleichen Position entspricht (z. B."Mouse|Monitor:299.99:10|Laptop:5|full,10")
Ihre Aufgabe ist es:
- Verwenden Sie dieselbe
Product-Struktur aus den vorherigen Lektionen mit den FeldernPrice(float64) undQuantity(int) - Verarbeiten Sie die erste Eingabe und initialisieren Sie die Bestands-Map mit den vorhandenen Produktdaten
- Zeigen Sie die Systemstartmeldung an:
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- Verarbeiten Sie die zweite Eingabe, um die Sequenz der auszuführenden Operationen zu erhalten
- Verarbeiten Sie die dritte Eingabe, um die Parameter für jede Operation zu erhalten
- Zeigen Sie für jede Operation in der Sequenz den Operations-Header an und führen Sie die entsprechende Aktion aus:
- Für
"check": Zeigen Sie"--- STOCK CHECK ---"an und prüfen Sie den Bestand für das angegebene Produkt - Für
"add": Zeigen Sie"--- ADD ITEM ---"an und fügen Sie das angegebene Produkt hinzu - Für
"update": Zeigen Sie"--- UPDATE STOCK ---"an und aktualisieren Sie den Bestand für das angegebene Produkt - Für
"report": Zeigen Sie"--- GENERATE REPORT ---"an und erstellen Sie den angegebenen Bericht - Für
"exit": Zeigen Sie"--- SYSTEM EXIT ---"an und geben Sie die Beendigungsinformationen aus
- Für
- Implementieren Sie die Funktion
checkStock, die Menge und Fehler wie in den vorherigen Lektionen zurückgibt - Implementieren Sie die Funktion
addNewItem, die Produkte hinzufügt und einen Fehler wie in den vorherigen Lektionen zurückgibt - Implementieren Sie die Funktion
updateStock, die Mengen aktualisiert und einen Fehler wie in den vorherigen Lektionen zurückgibt - Implementieren Sie die Funktion
generateReport, die Berichte wie in den vorherigen Lektionen erstellt - Für die Operation
"check":- Verwenden Sie den Parameter als den zu prüfenden Produktnamen
- Anzeige:
"Checking stock for: [product_name]" - Falls gefunden:
"Stock level: [quantity] units" - Falls nicht gefunden:
"Product not found in inventory"
- Für die Operation
"add":- Verarbeiten Sie den Parameter im Format
"product_name:price:quantity" - Anzeige:
"Adding new product: [product_name]" - Bei Erfolg:
"Product added successfully" - Bei Fehler:
"Failed to add product: [error_message]"
- Verarbeiten Sie den Parameter im Format
- Für die Operation
"update":- Verarbeiten Sie den Parameter im Format
"product_name:change" - Anzeige:
"Updating stock for: [product_name]" - Bei Erfolg und positivem Change:
"Added [change] units. New stock: [new_quantity]" - Bei Erfolg und negativem Change:
"Removed [absolute_change] units. New stock: [new_quantity]" - Bei Fehler:
"Update failed: [error_message]"
- Verarbeiten Sie den Parameter im Format
- Für die Operation
"report":- Verarbeiten Sie den Parameter im Format
"report_type,threshold" - Anzeige:
"Generating [report_type] report with threshold [threshold]" - Erstellen und zeigen Sie den vollständigen Bericht wie in den vorherigen Lektionen an
- Verarbeiten Sie den Parameter im Format
- Für die Operation
"exit":- Zeigen Sie die finalen Bestandsstatistiken an:
"Final inventory status:""Total products: [total_products]""Total items: [total_items]""Total value: $[total_value]"
- Anzeige:
"Session completed successfully" - Anzeige:
"Thank you for using the Inventory Management System"
- Zeigen Sie die finalen Bestandsstatistiken an:
- Zeigen Sie nach jeder Operation (außer Exit) an:
"Operation completed. Continuing to next operation..."
Verwenden Sie das Paket strings zum Aufteilen von Eingabestrings, das Paket strconv zum Konvertieren von Strings in Zahlen, das Paket errors für die Fehlerbehandlung, das Paket fmt für formatierte Ausgaben und das Paket sort für die alphabetische Sortierung. Formatieren Sie alle Preise und Werte auf 2 Dezimalstellen. Diese Herausforderung zeigt, wie man ein komplettes interaktives System erstellt, das mehrere funktionale Komponenten zu einer kohärenten Benutzererfahrung mit ordnungsgemäßer Fehlerbehandlung und Zustandsverwaltung integriert.
Probier es selbst
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func generateReport(inventory map[string]Product, reportType string, threshold float64) {
// Display report header
switch reportType {
case "full":
fmt.Println("=== FULL INVENTORY REPORT ===")
case "low_stock":
fmt.Println("=== LOW STOCK REPORT ===")
case "high_value":
fmt.Println("=== HIGH VALUE REPORT ===")
}
// Calculate general statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
averagePrice := totalValue / float64(totalItems)
// Display general 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)
fmt.Printf("Average Product Price: $%.2f\n", averagePrice)
// Filter products based on report type
var filteredProducts []string
for name, product := range inventory {
switch reportType {
case "full":
filteredProducts = append(filteredProducts, name)
case "low_stock":
if product.Quantity <= int(threshold) {
filteredProducts = append(filteredProducts, name)
}
case "high_value":
productValue := product.Price * float64(product.Quantity)
if productValue >= threshold {
filteredProducts = append(filteredProducts, name)
}
}
}
// Sort filtered products alphabetically
sort.Strings(filteredProducts)
// Display filtered products section header
switch reportType {
case "full":
fmt.Println("All Products:")
case "low_stock":
fmt.Printf("Products with stock ≤ %.0f:\n", threshold)
case "high_value":
fmt.Printf("Products with value ≥ $%.2f:\n", threshold)
}
// Display filtered products
filteredItems := 0
filteredValue := 0.0
for _, name := range filteredProducts {
product := inventory[name]
productValue := product.Price * float64(product.Quantity)
fmt.Printf("- %s: $%.2f × %d = $%.2f\n", name, product.Price, product.Quantity, productValue)
filteredItems += product.Quantity
filteredValue += productValue
}
// Display filtered statistics
fmt.Println("Filtered Results:")
fmt.Printf("Products shown: %d\n", len(filteredProducts))
fmt.Printf("Items in filtered products: %d\n", filteredItems)
fmt.Printf("Value of filtered products: $%.2f\n", filteredValue)
// Find most and least expensive products
var mostExpensiveName, leastExpensiveName string
var mostExpensivePrice, leastExpensivePrice float64
first := true
var sortedNames []string
for name := range inventory {
sortedNames = append(sortedNames, name)
}
sort.Strings(sortedNames)
for _, name := range sortedNames {
product := inventory[name]
if first {
mostExpensiveName = name
mostExpensivePrice = product.Price
leastExpensiveName = name
leastExpensivePrice = product.Price
first = false
} else {
if product.Price > mostExpensivePrice {
mostExpensiveName = name
mostExpensivePrice = product.Price
}
if product.Price < leastExpensivePrice {
leastExpensiveName = name
leastExpensivePrice = product.Price
}
}
}
fmt.Println("Price Analysis:")
fmt.Printf("Most expensive: %s at $%.2f\n", mostExpensiveName, mostExpensivePrice)
fmt.Printf("Least expensive: %s at $%.2f\n", leastExpensiveName, leastExpensivePrice)
// Find highest and lowest stock products
var highestStockName, lowestStockName string
var highestStock, lowestStock int
first = true
for _, name := range sortedNames {
product := inventory[name]
if first {
highestStockName = name
highestStock = product.Quantity
lowestStockName = name
lowestStock = product.Quantity
first = false
} else {
if product.Quantity > highestStock {
highestStockName = name
highestStock = product.Quantity
}
if product.Quantity < lowestStock {
lowestStockName = name
lowestStock = product.Quantity
}
}
}
fmt.Println("Stock Analysis:")
fmt.Printf("Highest stock: %s with %d units\n", highestStockName, highestStock)
fmt.Printf("Lowest stock: %s with %d units\n", lowestStockName, lowestStock)
// Inventory health assessment
lowStockCount := 0
highStockCount := 0
highValueCount := 0
for _, product := range inventory {
if product.Quantity <= 5 {
lowStockCount++
}
if product.Quantity > 20 {
highStockCount++
}
productValue := product.Price * float64(product.Quantity)
if productValue >= 500.0 {
highValueCount++
}
}
fmt.Printf("Low stock items (≤5): %d\n", lowStockCount)
fmt.Printf("High stock items (>20): %d\n", highStockCount)
fmt.Printf("High value items (≥$500): %d\n", highValueCount)
// Report completion
fmt.Println("Report generated successfully")
fmt.Printf("Threshold applied: %.2f\n", threshold)
}
func main() {
var inventoryData string
var reportConfig string
fmt.Scanln(&inventoryData)
fmt.Scanln(&reportConfig)
// Parse inventory data
inventory := make(map[string]Product)
if inventoryData != "" {
products := strings.Split(inventoryData, ",")
for _, productStr := range products {
parts := strings.Split(productStr, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[name] = Product{Price: price, Quantity: quantity}
}
}
// Parse report configuration
configParts := strings.Split(reportConfig, ",")
reportType := configParts[0]
threshold, _ := strconv.ParseFloat(configParts[1], 64)
// Generate report
generateReport(inventory, reportType, threshold)
}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