Lagerbestand aktualisieren
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 48 von 68.
Aufgabe
EinfachErweitere dein Bestandsverwaltungssystem, indem du Aktualisierungen von Lagerbeständen mit umfassender Validierung und Fehlerbehandlung implementierst. Diese Herausforderung baut auf der vorherigen Funktionalität auf und fügt die Möglichkeit hinzu, die Mengen vorhandener Produkte zu ändern, während ungültige Vorgänge verhindert werden, die zu negativen Lagerbeständen führen könnten.
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 Anfragen zur Bestandsaktualisierung im Format
"product1:change1,product2:change2,product3:change3", wobei die Änderungen positive oder negative Ganzzahlen sein können (z. B."Mouse:10,Tablet:-5,Keyboard:-3")
Deine Aufgabe ist:
- Verwende dieselbe
Product-Struktur aus den vorherigen Lektionen mit den FeldernPrice(float64) undQuantity(int) - Teile die erste Eingabe an den Kommas, um einzelne vorhandene Produkteinträge zu erhalten
- Teile jeden vorhandenen Produkteintrag an den Doppelpunkten, um Produktname, Preis und Menge zu erhalten
- Konvertiere die Preiszeichenkette in float64 und die Mengenzeichenkette in int
- Erstelle und befülle die Map
inventorymit den vorhandenen Produktdaten - Erstelle eine Funktion namens
updateStock, die die Bestands-Map, den Produktnamen und die Mengenänderung als Parameter übernimmt und einen Fehler zurückgibt:- Wenn das Produkt im Bestand nicht existiert, gib einen Fehler mit der Meldung
"product not found: [product_name]"zurück - Wenn die Mengenänderung zu einem negativen Bestand führen würde (aktuelle Menge + Änderung < 0), gib einen Fehler mit der Meldung
"insufficient stock: cannot reduce [product_name] by [absolute_change_value], only [current_quantity] available"zurück - Wenn die Aktualisierung gültig ist, ändere die Produktmenge im Bestand und gib nil zurück
- Wenn das Produkt im Bestand nicht existiert, gib einen Fehler mit der Meldung
- Teile die zweite Eingabe an den Kommas, um die Liste der Anfragen zur Bestandsaktualisierung zu erhalten
- Teile jede Anfrage zur Aktualisierung an den Doppelpunkten, um Produktname und Mengenänderung zu erhalten
- Konvertiere die Zeichenkette der Mengenänderung in int
- Gib die Kopfzeile des Aktualisierungsvorgangs aus:
"Processing Stock Updates:" - Rufe für jede Anfrage zur Aktualisierung die Funktion
updateStockauf und gib die Ergebnisse aus:- Wenn kein Fehler auftritt und die Änderung positiv ist:
"[product_name]: Added [change] units - New stock: [new_quantity]" - Wenn kein Fehler auftritt und die Änderung negativ ist:
"[product_name]: Removed [absolute_change_value] units - New stock: [new_quantity]" - Wenn kein Fehler auftritt und die Änderung null ist:
"[product_name]: No change - Current stock: [current_quantity]" - Bei einem Fehler:
"[product_name]: Update failed - [error_message]"
- Wenn kein Fehler auftritt und die Änderung positiv ist:
- Zähle die Aktualisierungsstatistiken und gib sie aus:
"Update Summary:""Updates processed: [total_number_of_updates_processed]""Updates successful: [number_of_successful_updates]""Updates failed: [number_of_failed_updates]"
- Gib den aktualisierten Bestand alphabetisch nach Produktname sortiert aus:
"Updated Inventory:"- Für jedes Produkt:
"- [product_name]: $[price] (Stock: [quantity])"
- Berechne die endgültigen Bestandsstatistiken und gib sie aus:
"Final Inventory Statistics:""Total Products: [total_number_of_products_in_inventory]""Total Items in Stock: [sum_of_all_quantities]""Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
- Liste alle fehlgeschlagenen Aktualisierungen auf:
- Wenn Aktualisierungen fehlgeschlagen sind:
"Failed updates: [comma_separated_list_of_failed_product_names]" - Wenn keine Aktualisierungen fehlgeschlagen sind:
"All stock updates were processed successfully"
- Wenn Aktualisierungen fehlgeschlagen sind:
Verwende das Paket strings, um die Eingabezeichenketten zu teilen, das Paket strconv, um Zeichenketten in Zahlen umzuwandeln, das Paket errors, um Fehlermeldungen zu erstellen, das Paket fmt für formatierte Ausgaben und das Paket sort, um die Produktnamen alphabetisch zu sortieren. Formatiere alle Preise mit 2 Dezimalstellen und den Gesamtwert des Bestands ebenfalls mit 2 Dezimalstellen. Diese Herausforderung zeigt, wie vorhandene Daten sicher geändert werden können, während ungültige Vorgänge durch umfassende Validierung und Fehlerbehandlung verhindert werden.
Probier es selbst
package main
import (
"errors"
"fmt"
"sort"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func addNewItem(inventory map[string]Product, productName string, price float64, quantity int) error {
if _, exists := inventory[productName]; exists {
return errors.New("product already exists: " + productName)
}
inventory[productName] = Product{Price: price, Quantity: quantity}
return nil
}
func main() {
var existingInventory string
var newProducts string
fmt.Scanln(&existingInventory)
fmt.Scanln(&newProducts)
inventory := make(map[string]Product)
// Parse existing inventory
existingItems := strings.Split(existingInventory, ",")
for _, item := range existingItems {
parts := strings.Split(item, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[name] = Product{Price: price, Quantity: quantity}
}
// Parse new products to add
newItems := strings.Split(newProducts, ",")
fmt.Println("Adding New Items:")
itemsProcessed := 0
itemsAdded := 0
itemsRejected := 0
var rejectedProducts []string
for _, item := range newItems {
parts := strings.Split(item, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
itemsProcessed++
err := addNewItem(inventory, name, price, quantity)
if err != nil {
fmt.Printf("%s: Failed to add - %s\n", name, err.Error())
itemsRejected++
rejectedProducts = append(rejectedProducts, name)
} else {
fmt.Printf("%s: Successfully added - $%.2f (Stock: %d)\n", name, price, quantity)
itemsAdded++
}
}
// Addition summary
fmt.Println("Addition Summary:")
fmt.Printf("Items processed: %d\n", itemsProcessed)
fmt.Printf("Items added: %d\n", itemsAdded)
fmt.Printf("Items rejected: %d\n", itemsRejected)
// Display updated inventory in alphabetical order
fmt.Println("Updated Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
totalProducts := 0
totalItems := 0
totalValue := 0.0
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
totalProducts++
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
// Final inventory statistics
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 rejected products
if len(rejectedProducts) > 0 {
fmt.Printf("Rejected products: %s\n", strings.Join(rejectedProducts, ","))
} else {
fmt.Println("All new products were added 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