Añadir un nuevo artículo
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 47 de 68.
Desafío
FácilAmplía tu sistema de gestión de inventario implementando una funcionalidad para añadir nuevos productos de forma segura. Este desafío se basa en el sistema anterior de comprobación de existencias y añade la posibilidad de ampliar tu inventario mientras se evitan entradas duplicadas mediante un manejo adecuado de errores.
Recibirás dos entradas:
- Una cadena que contiene los datos del inventario existente con el formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(por ejemplo,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Una cadena que contiene los nuevos productos que se añadirán con el formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(por ejemplo,"Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Tu tarea consiste en:
- Usar la misma estructura
Productde las lecciones anteriores, con los camposPrice(float64) yQuantity(int) - Analizar la primera entrada dividiéndola por comas para obtener las entradas individuales de los productos existentes
- Para cada entrada de producto existente, dividirla por dos puntos para obtener el nombre, el precio y la cantidad del producto
- Convertir la cadena del precio a float64 y la cadena de la cantidad a int
- Crear y rellenar el mapa
inventorycon los datos de los productos existentes - Crear una función llamada
addNewItemque reciba como parámetros el mapa de inventario, el nombre del producto, el precio y la cantidad, y devuelva un error:- Si el producto ya existe en el inventario, devolver un error con el mensaje
"product already exists: [product_name]" - Si el producto no existe, añadirlo al inventario y devolver nil
- Si el producto ya existe en el inventario, devolver un error con el mensaje
- Analizar la segunda entrada dividiéndola por comas para obtener la lista de nuevos productos que se añadirán
- Para cada entrada de producto nuevo, dividirla por dos puntos para obtener el nombre, el precio y la cantidad del producto
- Convertir la cadena del precio a float64 y la cadena de la cantidad a int
- Mostrar el encabezado del proceso de adición:
"Adding New Items:" - Para cada producto nuevo, llamar a la función
addNewItemy mostrar los resultados:- Si no hay ningún error:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Si hay un error:
"[product_name]: Failed to add - [error_message]"
- Si no hay ningún error:
- Contar y mostrar las estadísticas de adición:
"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]"
- Mostrar el inventario actualizado en orden alfabético por nombre del producto:
"Updated Inventory:"- Para cada producto:
"- [product_name]: $[price] (Stock: [quantity])"
- Calcular y mostrar las estadísticas finales del 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]"
- Enumerar los productos rechazados:
- Si hay productos rechazados:
"Rejected products: [comma_separated_list_of_rejected_products]" - Si no hay productos rechazados:
"All new products were added successfully"
- Si hay productos rechazados:
Usa el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a números, el paquete errors para crear mensajes de error, el paquete fmt para la salida con formato y el paquete sort para ordenar alfabéticamente los nombres de los productos. Da formato a todos los precios con 2 decimales y al valor total del inventario con 2 decimales. Este desafío demuestra cómo ampliar colecciones de datos de forma segura mientras se evitan entradas duplicadas mediante un manejo y una validación adecuados de errores.
Pruébalo tú mismo
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")
}
}Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras8Proyecto: Inventario simple
Descripción general del proyectoVerificar el stock3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientosPractica por tu cuenta: Compilador de Go online