Aggiungere un nuovo articolo
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 47 di 68.
Sfida
FacileEstendi il tuo sistema di gestione dell'inventario implementando una funzionalità per aggiungere nuovi prodotti in sicurezza. Questa sfida si basa sul sistema di controllo delle scorte della lezione precedente e aggiunge la possibilità di ampliare l'inventario, impedendo al contempo la presenza di voci duplicate tramite una gestione appropriata degli errori.
Riceverai due input:
- Una stringa contenente i dati dell'inventario esistente nel formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(ad es.,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Una stringa contenente i nuovi prodotti da aggiungere nel formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(ad es.,"Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Il tuo compito è:
- Usare la stessa struttura
Productdelle lezioni precedenti, con i campiPrice(float64) eQuantity(int) - Analizzare il primo input suddividendolo in corrispondenza delle virgole per ottenere le singole voci dei prodotti esistenti
- Per ogni voce di prodotto esistente, suddividerla in corrispondenza dei due punti per ottenere il nome del prodotto, il prezzo e la quantità
- Convertire la stringa del prezzo in float64 e la stringa della quantità in int
- Creare e popolare la mappa
inventorycon i dati dei prodotti esistenti - Creare una funzione chiamata
addNewItemche accetti come parametri la mappa dell'inventario, il nome del prodotto, il prezzo e la quantità e restituisca un errore:- Se il prodotto esiste già nell'inventario, restituire un errore con il messaggio
"product already exists: [product_name]" - Se il prodotto non esiste, aggiungerlo all'inventario e restituire nil
- Se il prodotto esiste già nell'inventario, restituire un errore con il messaggio
- Analizzare il secondo input suddividendolo in corrispondenza delle virgole per ottenere l'elenco dei nuovi prodotti da aggiungere
- Per ogni nuova voce di prodotto, suddividerla in corrispondenza dei due punti per ottenere il nome del prodotto, il prezzo e la quantità
- Convertire la stringa del prezzo in float64 e la stringa della quantità in int
- Visualizzare l'intestazione del processo di aggiunta:
"Adding New Items:" - Per ogni nuovo prodotto, chiamare la funzione
addNewIteme visualizzare i risultati:- Se non si verifica alcun errore:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - In caso di errore:
"[product_name]: Failed to add - [error_message]"
- Se non si verifica alcun errore:
- Conteggiare e visualizzare le statistiche dell'aggiunta:
"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]"
- Visualizzare l'inventario aggiornato in ordine alfabetico per nome del prodotto:
"Updated Inventory:"- Per ogni prodotto:
"- [product_name]: $[price] (Stock: [quantity])"
- Calcolare e visualizzare le statistiche finali dell'inventario:
"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]"
- Elencare gli eventuali prodotti rifiutati:
- Se ci sono prodotti rifiutati:
"Rejected products: [comma_separated_list_of_rejected_products]" - Se non ci sono prodotti rifiutati:
"All new products were added successfully"
- Se ci sono prodotti rifiutati:
Usa il pacchetto strings per suddividere le stringhe di input, il pacchetto strconv per convertire le stringhe in numeri, il pacchetto errors per creare i messaggi di errore, il pacchetto fmt per l'output formattato e il pacchetto sort per ordinare alfabeticamente i nomi dei prodotti. Formatta tutti i prezzi con 2 cifre decimali e il valore totale dell'inventario con 2 cifre decimali. Questa sfida mostra come ampliare in sicurezza le raccolte di dati, impedendo la presenza di voci duplicate tramite una gestione e una convalida appropriate degli errori.
Provalo tu
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")
}
}Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole8Progetto: inventario semplice
Panoramica del progettoControllare le scorte3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online