Einen neuen Artikel hinzufügen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 47 von 68.
Aufgabe
EinfachErweitern Sie Ihr Inventarverwaltungssystem, indem Sie eine Funktionalität zum sicheren Hinzufügen neuer Produkte implementieren. Diese Herausforderung baut auf dem vorherigen Bestandsprüfungssystem auf und fügt die Möglichkeit hinzu, Ihr Inventar zu erweitern, während doppelte Einträge durch ordnungsgemäße Fehlerbehandlung verhindert werden.
Sie erhalten zwei Eingaben:
- Einen String, der die vorhandenen 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 die neu hinzuzufügenden Produkte im Format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"enthält (z. B."Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Ihre Aufgabe ist es:
- Verwenden Sie dieselbe
Product-Struktur aus den vorherigen Lektionen mit den FeldernPrice(float64) undQuantity(int) - Analysieren Sie die erste Eingabe, indem Sie sie an Kommas aufteilen, um die einzelnen vorhandenen Produkteinträge zu erhalten
- Teilen Sie für jeden vorhandenen Produkteintrag den String 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
addNewItem, die die inventory-Map, den Produktnamen, den Preis und die Menge als Parameter entgegennimmt und einen Fehler zurückgibt:- Wenn das Produkt bereits im Inventar vorhanden ist, geben Sie einen Fehler mit der Meldung
"product already exists: [product_name]"zurück - Wenn das Produkt nicht existiert, fügen Sie es dem Inventar hinzu und geben Sie nil zurück
- Wenn das Produkt bereits im Inventar vorhanden ist, geben Sie einen Fehler mit der Meldung
- Analysieren Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um die Liste der neu hinzuzufügenden Produkte zu erhalten
- Teilen Sie für jeden neuen Produkteintrag den String an Doppelpunkten auf, um Produktname, Preis und Menge zu erhalten
- Konvertieren Sie den Preis-String in float64 und den Mengen-String in int
- Zeigen Sie die Kopfzeile für den Hinzufügungsprozess an:
"Adding New Items:" - Rufen Sie für jedes neue Produkt die Funktion
addNewItemauf und zeigen Sie die Ergebnisse an:- Wenn kein Fehler auftritt:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Im Fehlerfall:
"[product_name]: Failed to add - [error_message]"
- Wenn kein Fehler auftritt:
- Zählen und zeigen Sie Statistiken zum Hinzufügen an:
"Addition Summary:""Items processed: [total_number_of_items_processed]""Items added: [number_of_items_successfully_added]""Items rejected: [number_of_items_that_failed_to_add]"
- Zeigen Sie das aktualisierte Inventar in alphabetischer Reihenfolge nach Produktnamen an:
"Updated Inventory:"- Für jedes Produkt:
"- [product_name]: $[price] (Stock: [quantity])"
- Berechnen und zeigen Sie die abschließenden Inventarstatistiken an:
"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]"
- Listen Sie alle abgelehnten Produkte auf:
- Wenn es abgelehnte Produkte gibt:
"Rejected products: [comma_separated_list_of_rejected_products]" - Wenn keine Produkte abgelehnt wurden:
"All new products were added successfully"
- Wenn es abgelehnte Produkte gibt:
Verwenden Sie das strings-Paket, um die Eingabestrings aufzuteilen, das strconv-Paket, um Strings in Zahlen umzuwandeln, das errors-Paket, um Fehlermeldungen zu erstellen, das fmt-Paket für die formatierte Ausgabe und das sort-Paket, um Produktnamen alphabetisch zu sortieren. Formatieren Sie alle Preise auf 2 Dezimalstellen und den Gesamtinventarwert auf 2 Dezimalstellen. Diese Herausforderung zeigt, wie man Datensammlungen sicher erweitert und gleichzeitig doppelte Einträge durch ordnungsgemäße Fehlerbehandlung und Validierung verhindert.
Probier es selbst
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func checkStock(inventory map[string]Product, productName string) (int, error) {
product, exists := inventory[productName]
if !exists {
return 0, errors.New("product not found: " + productName)
}
return product.Quantity, nil
}
func main() {
var inventoryData string
var checkRequests string
fmt.Scanln(&inventoryData)
fmt.Scanln(&checkRequests)
inventory := make(map[string]Product)
// Parse inventory data
productEntries := strings.Split(inventoryData, ",")
for _, entry := range productEntries {
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 check requests
productsToCheck := strings.Split(checkRequests, ",")
fmt.Println("Stock Check Results:")
var productsFound int
var productsNotFound int
var totalStock int
var missingProducts []string
for _, productName := range productsToCheck {
quantity, err := checkStock(inventory, productName)
if err != nil {
fmt.Printf("%s: Error - %s\n", productName, err.Error())
productsNotFound++
missingProducts = append(missingProducts, productName)
} else {
fmt.Printf("%s: %d units in stock\n", productName, quantity)
productsFound++
totalStock += quantity
}
}
fmt.Println("Check Summary:")
fmt.Printf("Products checked: %d\n", len(productsToCheck))
fmt.Printf("Products found: %d\n", productsFound)
fmt.Printf("Products not found: %d\n", productsNotFound)
fmt.Printf("Total stock for found products: %d units\n", totalStock)
if len(missingProducts) > 0 {
fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
} else {
fmt.Println("All requested products are available")
}
}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