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 des stocks en implémentant une fonctionnalité permettant d’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 possibilité d’étendre 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 d’inventaire existantes 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
Productque dans les leçons précédentes, avec les champsPrice(float64) etQuantity(int) - Analyser la première entrée en la divisant sur les virgules afin d’obtenir les entrées des produits existants
- Pour chaque entrée de produit existant, la diviser sur les deux-points afin d’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 appelée
addNewItemqui prend la map d’inventaire, le nom du produit, le prix et la quantité comme paramètres et renvoie une erreur :- Si le produit existe déjà dans l’inventaire, renvoyer une erreur avec le message
"product already exists: [product_name]" - Si le produit n’existe pas, l’ajouter à l’inventaire et renvoyer nil
- Si le produit existe déjà dans l’inventaire, renvoyer une erreur avec le message
- Analyser la deuxième entrée en la divisant sur les virgules afin d’obtenir la liste des nouveaux produits à ajouter
- Pour chaque nouvelle entrée de produit, la diviser sur les deux-points afin d’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 :- En l’absence d’erreur :
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - En cas d’erreur :
"[product_name]: Failed to add - [error_message]"
- En l’absence d’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 dans l’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]"
- Répertorier 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 diviser les chaînes d’entrée, le package strconv pour convertir les chaînes en nombres, le package errors pour créer les 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 avec 2 décimales et la valeur totale de l’inventaire avec 2 décimales. Ce défi montre comment étendre des collections de données en toute sécurité tout en empêchant les entrées en double grâce à une gestion et une validation appropriées des erreurs.
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 comportementsEntraînez-vous par vous-même : Compilateur Go en ligne