Adicionando um Novo Item
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 47 de 68.
Desafio
FácilEstenda seu sistema de gerenciamento de inventário implementando a funcionalidade de adicionar novos produtos com segurança. Este desafio baseia-se no sistema de verificação de estoque anterior e adiciona a capacidade de expandir seu inventário, evitando entradas duplicadas por meio de um tratamento de erros adequado.
Você receberá duas entradas:
- Uma string contendo os dados do inventário existente no formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(ex:"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"(ex:"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 de produtos existentes
- Para cada entrada de produto existente, dividir por dois pontos para obter o nome do produto, preço e quantidade
- Converter a string de preço para float64 e a string de quantidade para int
- Criar e preencher o mapa
inventorycom os dados dos produtos existentes - Criar uma função chamada
addNewItemque recebe o mapa de inventário, o nome do produto, o preço e a quantidade como parâmetros e retorna um erro:- Se o produto já existir no inventário, retorne um erro com a mensagem
"product already exists: [product_name]" - Se o produto não existir, adicione-o ao inventário e retorne nil
- Se o produto já existir no inventário, retorne 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, dividir por dois pontos para obter o nome do produto, preço e quantidade
- Converter a string de preço para float64 e a string de 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 inventário atualizado em ordem alfabética pelo nome do produto:
"Updated Inventory:"- Para cada produto:
"- [product_name]: $[price] (Stock: [quantity])"
- Calcular e exibir as estatísticas finais do inventário:
"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 quaisquer 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 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 inventário com 2 casas decimais. Este desafio demonstra como expandir coleções de dados com segurança, evitando entradas duplicadas por meio de tratamento de erros e validação adequados.
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 Comportamentos