Einen neuen Artikel hinzufügen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 47 von 68.
Aufgabe
EinfachErweitere dein Bestandsverwaltungssystem, indem du eine Funktion zum sicheren Hinzufügen neuer Produkte implementierst. Diese Herausforderung baut auf dem vorherigen System zur Bestandsprüfung auf und ergänzt die Möglichkeit, deinen Bestand zu erweitern und dabei durch eine geeignete Fehlerbehandlung doppelte Einträge zu verhindern.
Du erhältst zwei Eingaben:
- Eine Zeichenkette mit den 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 den hinzuzufügenden neuen Produkten im Format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(z. B."Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Deine Aufgabe ist es:
- Dieselbe
Product-Struktur wie in den vorherigen Lektionen mit den FeldernPrice(float64) undQuantity(int) zu verwenden - Die erste Eingabe durch Aufteilen an Kommas zu verarbeiten, um einzelne vorhandene Produkteinträge zu erhalten
- Für jeden vorhandenen Produkteintrag an Doppelpunkten aufzuteilen, um Produktname, Preis und Menge zu erhalten
- Die Preiszeichenkette in float64 und die Mengenzeichenkette in int umzuwandeln
- Die Map
inventoryzu erstellen und mit den vorhandenen Produktdaten zu befüllen - Eine Funktion namens
addNewItemzu erstellen, die die Bestands-Map, den Produktnamen, den Preis und die Menge als Parameter übernimmt und einen Fehler zurückgibt:- Wenn das Produkt bereits im Bestand vorhanden ist, einen Fehler mit der Nachricht
"product already exists: [product_name]"zurückzugeben - Wenn das Produkt nicht vorhanden ist, es zum Bestand hinzuzufügen und nil zurückzugeben
- Wenn das Produkt bereits im Bestand vorhanden ist, einen Fehler mit der Nachricht
- Die zweite Eingabe durch Aufteilen an Kommas zu verarbeiten, um die Liste der hinzuzufügenden neuen Produkte zu erhalten
- Für jeden neuen Produkteintrag an Doppelpunkten aufzuteilen, um Produktname, Preis und Menge zu erhalten
- Die Preiszeichenkette in float64 und die Mengenzeichenkette in int umzuwandeln
- Die Überschrift für den Hinzufügevorgang anzuzeigen:
"Adding New Items:" - Für jedes neue Produkt die Funktion
addNewItemaufzurufen und die Ergebnisse anzuzeigen:- Wenn kein Fehler auftritt:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Wenn ein Fehler auftritt:
"[product_name]: Failed to add - [error_message]"
- Wenn kein Fehler auftritt:
- Die Hinzufügestatistiken zu zählen und anzuzeigen:
"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]"
- Den aktualisierten Bestand alphabetisch nach Produktname anzuzeigen:
"Updated Inventory:"- Für jedes Produkt:
"- [product_name]: $[price] (Stock: [quantity])"
- Die abschließenden Bestandsstatistiken zu berechnen und anzuzeigen:
"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]"
- Alle abgelehnten Produkte aufzulisten:
- Wenn es abgelehnte Produkte gibt:
"Rejected products: [comma_separated_list_of_rejected_products]" - Wenn es keine abgelehnten Produkte gibt:
"All new products were added successfully"
- Wenn es abgelehnte Produkte gibt:
Verwende das Paket strings, um die Eingabezeichenketten aufzuteilen, 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 sich Datensammlungen sicher erweitern lassen, während durch geeignete Fehlerbehandlung und Validierung doppelte Einträge verhindert werden.
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Übe selbstständig: Online-Go-Compiler