Adicionando um Novo Item
Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 47 de 68.
Desafio
FácilAmplie seu sistema de gerenciamento de estoque implementando uma funcionalidade para adicionar novos produtos com segurança. Este desafio se baseia no sistema anterior de verificação de estoque e adiciona a capacidade de expandir seu estoque, evitando entradas duplicadas por meio de um tratamento adequado de erros.
Você receberá duas entradas:
- Uma string contendo os dados do estoque existente no formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(por exemplo,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Uma string contendo os novos produtos a serem adicionados no formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(por exemplo,"Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Sua tarefa é:
- Usar a mesma struct
Productdas lições anteriores, com os camposPrice(float64) eQuantity(int) - Analisar a primeira entrada dividindo-a por vírgulas para obter as entradas individuais dos produtos existentes
- Para cada entrada de produto existente, dividi-la por dois-pontos para obter o nome, o preço e a quantidade do produto
- Converter a string do preço para float64 e a string da quantidade para int
- Criar e preencher o mapa
inventorycom os dados dos produtos existentes - Criar uma função chamada
addNewItemque receba o mapa de estoque, o nome do produto, o preço e a quantidade como parâmetros e retorne um erro:- Se o produto já existir no estoque, retornar um erro com a mensagem
"product already exists: [product_name]" - Se o produto não existir, adicioná-lo ao estoque e retornar nil
- Se o produto já existir no estoque, retornar um erro com a mensagem
- Analisar a segunda entrada dividindo-a por vírgulas para obter a lista de novos produtos a serem adicionados
- Para cada nova entrada de produto, dividi-la por dois-pontos para obter o nome, o preço e a quantidade do produto
- Converter a string do preço para float64 e a string da quantidade para int
- Exibir o cabeçalho do processo de adição:
"Adding New Items:" - Para cada novo produto, chamar a função
addNewIteme exibir os resultados:- Se não houver erro:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Se houver erro:
"[product_name]: Failed to add - [error_message]"
- Se não houver erro:
- Contar e exibir as estatísticas de adição:
"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]"
- Exibir o estoque atualizado em ordem alfabética por nome do produto:
"Updated Inventory:"- Para cada produto:
"- [product_name]: $[price] (Stock: [quantity])"
- Calcular e exibir as estatísticas finais do estoque:
"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 todos os produtos rejeitados:
- Se houver produtos rejeitados:
"Rejected products: [comma_separated_list_of_rejected_products]" - Se não houver produtos rejeitados:
"All new products were added successfully"
- Se houver produtos rejeitados:
Use o pacote strings para dividir as strings de entrada, o pacote strconv para converter strings em números, o pacote errors para criar mensagens de erro, o pacote fmt para a saída formatada e o pacote sort para ordenar os nomes dos produtos alfabeticamente. Formate todos os preços com 2 casas decimais e o valor total do estoque com 2 casas decimais. Este desafio demonstra como ampliar coleções de dados com segurança, evitando entradas duplicadas por meio de um tratamento adequado de erros e validação.
Experimente você mesmo
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 as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras8Projeto: Inventário Simples
Visão Geral do ProjetoVerificando o Estoque3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e ComportamentosPratique por conta própria: Compilador de Go online