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ácilExtiende 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 de verificación de stock anterior y añade la capacidad de ampliar tu inventario mientras se evitan entradas duplicadas mediante un manejo de errores adecuado.
Recibirás dos entradas:
- Una cadena que contiene los datos del inventario existente en 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 a añadir en 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 es:
- Usar la misma estructura
Productde lecciones anteriores con los camposPrice(float64) yQuantity(int) - Analizar la primera entrada dividiéndola por comas para obtener las entradas individuales de productos existentes
- Para cada entrada de producto existente, dividir por dos puntos para obtener el nombre del producto, el precio y la cantidad
- Convertir la cadena de precio a float64 y la cadena de cantidad a int
- Crear y poblar el mapa
inventorycon los datos de los productos existentes - Crear una función llamada
addNewItemque reciba el mapa de inventario, el nombre del producto, el precio y la cantidad como parámetros 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 a añadir
- Para cada nueva entrada de producto, dividir por dos puntos para obtener el nombre del producto, el precio y la cantidad
- Convertir la cadena de precio a float64 y la cadena de cantidad a int
- Mostrar el encabezado del proceso de adición:
"Adding New Items:" - Para cada nuevo producto, llamar a la función
addNewItemy mostrar los resultados:- Si no hay error:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Si hay error:
"[product_name]: Failed to add - [error_message]"
- Si no hay 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 de 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]"
- Listar cualquier producto rechazado:
- 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 formateada y el paquete sort para ordenar los nombres de los productos alfabéticamente. Formatea todos los precios a 2 decimales y el valor total del inventario a 2 decimales. Este desafío demuestra cómo expandir colecciones de datos de forma segura mientras se evitan entradas duplicadas mediante el manejo de errores y la validación adecuados.
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 comportamientos