Einen Bericht erstellen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 49 von 68.
Aufgabe
EinfachVervollständigen Sie Ihr Bestandsverwaltungssystem, indem Sie eine umfassende Berichtsfunktion implementieren, die detaillierte Einblicke in Ihren aktuellen Bestand bietet. Diese Herausforderung baut auf allen vorherigen Funktionen auf und fügt die Möglichkeit hinzu, formatierte Berichte mit Statistiken, Kategorisierung und Analysen zu erstellen.
Sie erhalten zwei Eingaben:
- Einen String, der bestehende 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 die Berichtskonfiguration im Format
"report_type,threshold_value"enthält, wobei report_type"full","low_stock"oder"high_value"sein kann und threshold_value eine Zahl ist (z. B."low_stock,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, indem Sie sie an Kommas aufteilen, um die einzelnen vorhandenen Produkteinträge zu erhalten
- Teilen Sie jeden vorhandenen 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 vorhandenen Produktdaten - Erstellen Sie eine Funktion namens
generateReport, die die inventory-Map, den Berichtstyp und den Schwellenwert als Parameter entgegennimmt - Verarbeiten Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um Berichtstyp und Schwellenwert zu erhalten
- Konvertieren Sie den Schwellenwert-String in float64
- Zeigen Sie den Berichtskopf basierend auf dem Berichtstyp an:
- Für
"full":"=== FULL INVENTORY REPORT ===" - Für
"low_stock":"=== LOW STOCK REPORT ===" - Für
"high_value":"=== HIGH VALUE REPORT ==="
- Für
- Zeigen Sie allgemeine Bestandsstatistiken an:
"Total Products: [total_number_of_products]""Total Items in Stock: [sum_of_all_quantities]""Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]""Average Product Price: $[total_inventory_value_divided_by_total_items]"
- Filtern und zeigen Sie Produkte basierend auf dem Berichtstyp an:
- Für
"full": Alle Produkte anzeigen - Für
"low_stock": Nur Produkte anzeigen, deren Menge kleiner oder gleich dem Schwellenwert ist - Für
"high_value": Nur Produkte anzeigen, deren Gesamtwert (Preis × Menge) größer oder gleich dem Schwellenwert ist
- Für
- Zeigen Sie den Abschnitt für gefilterte Produkte an:
- Für
"full":"All Products:" - Für
"low_stock":"Products with stock ≤ [threshold_value]:" - Für
"high_value":"Products with value ≥ $[threshold_value]:"
- Für
- Für jedes gefilterte Produkt (in alphabetischer Reihenfolge nach Produktname):
"- [product_name]: $[price] × [quantity] = $[total_value]"
- Zeigen Sie gefilterte Statistiken an:
"Filtered Results:""Products shown: [number_of_products_in_filtered_results]""Items in filtered products: [sum_of_quantities_for_filtered_products]""Value of filtered products: $[sum_of_values_for_filtered_products]"
- Finden und zeigen Sie die teuersten und günstigsten Produkte an:
"Price Analysis:""Most expensive: [product_name] at $[price]""Least expensive: [product_name] at $[price]"
- Finden und zeigen Sie die Produkte mit dem höchsten und niedrigsten Lagerbestand an:
"Stock Analysis:""Highest stock: [product_name] with [quantity] units""Lowest stock: [product_name] with [quantity] units"
- Zeigen Sie eine Bewertung des Bestandszustands an:
- Zählen Sie Produkte mit Menge ≤ 5:
"Low stock items (≤5): [count]" - Zählen Sie Produkte mit Menge > 20:
"High stock items (>20): [count]" - Zählen Sie Produkte mit Wert ≥ $500:
"High value items (≥$500): [count]"
- Zählen Sie Produkte mit Menge ≤ 5:
- Zeigen Sie den Abschluss des Berichts an:
"Report generated successfully""Threshold applied: [threshold_value]"
Verwenden Sie das strings-Paket, um die Eingabestrings aufzuteilen, das strconv-Paket, um Strings in Zahlen umzuwandeln, das fmt-Paket für die formatierte Ausgabe und das sort-Paket, um Produktnamen alphabetisch zu sortieren. Formatieren Sie alle Preise und Werte auf 2 Dezimalstellen. Wenn Sie die teuersten/günstigsten Produkte oder den höchsten/niedrigsten Lagerbestand ermitteln und Gleichstand herrscht, verwenden Sie den alphabetisch ersten Produktnamen. Diese Herausforderung zeigt, wie man umfassende Berichtssysteme erstellt, die durch Datenanalyse und formatierte Präsentation wertvolle Geschäftseinblicke liefern.
Probier es selbst
package main
import (
"errors"
"fmt"
"sort"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func updateStock(inventory map[string]Product, productName string, change int) error {
product, exists := inventory[productName]
if !exists {
return errors.New("product not found: " + productName)
}
newQuantity := product.Quantity + change
if newQuantity < 0 {
return fmt.Errorf("insufficient stock: cannot reduce %s by %d, only %d available", productName, -change, product.Quantity)
}
product.Quantity = newQuantity
inventory[productName] = product
return nil
}
func main() {
var inventoryData string
var updateRequests string
fmt.Scanln(&inventoryData)
fmt.Scanln(&updateRequests)
// Parse existing inventory
inventory := make(map[string]Product)
inventoryEntries := strings.Split(inventoryData, ",")
for _, entry := range inventoryEntries {
parts := strings.Split(entry, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[name] = Product{
Price: price,
Quantity: quantity,
}
}
// Parse update requests
updateEntries := strings.Split(updateRequests, ",")
fmt.Println("Processing Stock Updates:")
totalUpdates := len(updateEntries)
successfulUpdates := 0
failedUpdates := 0
var failedProducts []string
for _, update := range updateEntries {
parts := strings.Split(update, ":")
productName := parts[0]
change, _ := strconv.Atoi(parts[1])
err := updateStock(inventory, productName, change)
if err != nil {
fmt.Printf("%s: Update failed - %s\n", productName, err.Error())
failedUpdates++
failedProducts = append(failedProducts, productName)
} else {
newQuantity := inventory[productName].Quantity
if change > 0 {
fmt.Printf("%s: Added %d units - New stock: %d\n", productName, change, newQuantity)
} else if change < 0 {
fmt.Printf("%s: Removed %d units - New stock: %d\n", productName, -change, newQuantity)
} else {
fmt.Printf("%s: No change - Current stock: %d\n", productName, newQuantity)
}
successfulUpdates++
}
}
// Update summary
fmt.Println("Update Summary:")
fmt.Printf("Updates processed: %d\n", totalUpdates)
fmt.Printf("Updates successful: %d\n", successfulUpdates)
fmt.Printf("Updates failed: %d\n", failedUpdates)
// Display updated inventory in alphabetical order
fmt.Println("Updated 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)
}
// Calculate final statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
fmt.Println("Final 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)
// List failed updates
if len(failedProducts) > 0 {
fmt.Printf("Failed updates: %s\n", strings.Join(failedProducts, ","))
} else {
fmt.Println("All stock updates were processed 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