Verificando o Estoque
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 46 de 68.
Desafio
FácilImplemente uma função de verificação de estoque para o seu sistema de gerenciamento de inventário que recupere com segurança as quantidades de produtos e trate casos em que os produtos não existem. Este desafio baseia-se na base de inventário da lição anterior e adiciona tratamento de erros para consultas de estoque.
Você receberá duas entradas:
- Uma string contendo dados de inventário existentes 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 solicitações de verificação de estoque no formato
"product1,product2,product3"(ex:"Mouse,Tablet,Keyboard")
Sua tarefa é:
- Usar a mesma struct
Productda lição anterior com os camposPrice(float64) eQuantity(int) - Analisar a primeira entrada dividindo-a por vírgulas para obter as entradas individuais de produtos
- Para cada 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
- Criar e preencher o mapa
inventorycom os dados de produtos analisados - Criar uma função chamada
checkStockque recebe o mapa de inventário e um nome de produto como parâmetros e retorna (int, error):- Se o produto existir no inventário, retornar sua quantidade e nil
- Se o produto não existir, retornar 0 e um erro com a mensagem
"product not found: [product_name]"
- Analisar a segunda entrada dividindo-a por vírgulas para obter a lista de produtos a serem verificados
- Exibir o cabeçalho de verificação de estoque:
"Stock Check Results:" - Para cada produto na lista de verificação, chamar a função
checkStocke exibir os resultados:- Se não houver erro:
"[product_name]: [quantity] units in stock" - Se houver erro:
"[product_name]: Error - [error_message]"
- Se não houver erro:
- Contar e exibir estatísticas de resumo:
"Check Summary:""Products checked: [total_number_of_products_checked]""Products found: [number_of_products_that_exist]""Products not found: [number_of_products_that_dont_exist]"
- Exibir o estoque total para os produtos encontrados:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- Listar quaisquer produtos ausentes:
- Se houver produtos ausentes:
"Missing products: [comma_separated_list_of_missing_products]" - Se não houver produtos ausentes:
"All requested products are available"
- Se houver produtos ausentes:
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 e o pacote fmt para saída formatada. Este desafio demonstra como implementar a recuperação segura de dados com o tratamento de erros adequado, um padrão fundamental em sistemas de gerenciamento de inventário.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
// Define the Product struct
type Product struct {
Price float64
Quantity int
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
storeInfo := scanner.Text()
scanner.Scan()
productData := scanner.Text()
// 1. Parse store information (split by comma)
storeInfoParts := strings.Split(storeInfo, ",")
storeName := ""
location := ""
if len(storeInfoParts) >= 2 {
storeName = storeInfoParts[0]
location = storeInfoParts[1]
}
// 2. Parse product data (split by comma, then by colon for each product)
productEntries := strings.Split(productData, ",")
// 3. Create inventory map
inventory := make(map[string]Product)
// 4. Convert strings to appropriate types and populate inventory
for _, entry := range productEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 3 {
productName := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[productName] = Product{
Price: price,
Quantity: quantity,
}
}
}
// 5. Display store information
fmt.Printf("=== %s Inventory System ===\n", storeName)
fmt.Printf("Location: %s\n", location)
fmt.Printf("Inventory initialized with %d products\n", len(inventory))
// 6. Display current inventory (sorted alphabetically)
fmt.Println("Current Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
}
// 7. Calculate and display inventory statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
fmt.Println("Inventory Statistics:")
fmt.Printf("Total Products: %d\n", totalProducts)
fmt.Printf("Total Items in Stock: %d\n", totalItems)
fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
// 8. Display system status
fmt.Println("System Status: Ready")
fmt.Println("Inventory management system initialized successfully")
}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