Ajouter un nouvel article
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 47 sur 68.
Défi
FacileÉtendez votre système de gestion d'inventaire en implémentant une fonctionnalité pour ajouter de nouveaux produits en toute sécurité. Ce défi s'appuie sur le système de vérification des stocks précédent et ajoute la capacité d'élargir votre inventaire tout en empêchant les entrées en double grâce à une gestion appropriée des erreurs.
Vous recevrez deux entrées :
- Une chaîne contenant les données de l'inventaire existant au format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(par exemple,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Une chaîne contenant les nouveaux produits à ajouter au format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(par exemple,"Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Votre tâche consiste à :
- Utiliser la même structure
Productdes leçons précédentes avec les champsPrice(float64) etQuantity(int) - Analyser la première entrée en la découpant au niveau des virgules pour obtenir les entrées individuelles des produits existants
- Pour chaque entrée de produit existant, découper au niveau des deux-points pour obtenir le nom du produit, le prix et la quantité
- Convertir la chaîne du prix en float64 et la chaîne de la quantité en int
- Créer et remplir la map
inventoryavec les données des produits existants - Créer une fonction nommée
addNewItemqui prend la map inventory, le nom du produit, le prix et la quantité comme paramètres et retourne une erreur :- Si le produit existe déjà dans l'inventaire, retourner une erreur avec le message
"product already exists: [product_name]" - Si le produit n'existe pas, l'ajouter à l'inventaire et retourner nil
- Si le produit existe déjà dans l'inventaire, retourner une erreur avec le message
- Analyser la seconde entrée en la découpant au niveau des virgules pour obtenir la liste des nouveaux produits à ajouter
- Pour chaque nouvelle entrée de produit, découper au niveau des deux-points pour obtenir le nom du produit, le prix et la quantité
- Convertir la chaîne du prix en float64 et la chaîne de la quantité en int
- Afficher l'en-tête du processus d'ajout :
"Adding New Items:" - Pour chaque nouveau produit, appeler la fonction
addNewItemet afficher les résultats :- Si aucune erreur :
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Si erreur :
"[product_name]: Failed to add - [error_message]"
- Si aucune erreur :
- Compter et afficher les statistiques d'ajout :
"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]"
- Afficher l'inventaire mis à jour par ordre alphabétique des noms de produits :
"Updated Inventory:"- Pour chaque produit :
"- [product_name]: $[price] (Stock: [quantity])"
- Calculer et afficher les statistiques finales de l'inventaire :
"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]"
- Lister tous les produits rejetés :
- S'il y a des produits rejetés :
"Rejected products: [comma_separated_list_of_rejected_products]" - Si aucun produit n'est rejeté :
"All new products were added successfully"
- S'il y a des produits rejetés :
Utilisez le package strings pour découper les chaînes d'entrée, le package strconv pour convertir les chaînes en nombres, le package errors pour créer des messages d'erreur, le package fmt pour la sortie formatée, et le package sort pour trier les noms de produits par ordre alphabétique. Formatez tous les prix à 2 décimales et la valeur totale de l'inventaire à 2 décimales. Ce défi démontre comment étendre en toute sécurité des collections de données tout en empêchant les entrées en double grâce à une gestion des erreurs et une validation appropriées.
Essayez vous-même
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")
}
}Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots8Projet : Inventaire simple
Aperçu du projetVérifier le stock3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements