# Controle de Estoque CLI Aplicação de linha de comando (CLI) em Go para gerenciar um estoque de produtos. Projeto de estudo focado em organização de código em camadas (MVC) e no uso de estruturas de dados nativas do Go. ## Funcionalidades - **Adicionar** produtos ao estoque (nome, categoria, preço e quantidade) - **Listar** todos os produtos cadastrados - **Atualizar** um campo específico de um produto pelo ID - **Deletar** um produto pelo ID ## Como executar Requer [Go](https://go.dev/) 1.26 ou superior instalado. ```bash go run . ``` Para compilar um binário: ```bash go build -o controle-de-estoque ./controle-de-estoque ``` ## Uso Ao iniciar, o programa exibe um menu. Escolha uma opção pelo número ou pelo nome: ``` 1 / adicionar - Adiciona o produto no estoque 2 / listar - Lista todos os produtos do estoque 3 / atualizar - Atualiza um produto do estoque 4 / deletar - Deleta um produto do estoque 0 / sair - Sair do programa ``` Ao **atualizar**, informe o ID do produto e o campo desejado (`nome`, `categoria`, `preco` ou `quantidade`), seguido do novo valor. ## Estrutura do projeto O código é organizado em camadas, separando responsabilidades: ``` . ├── main.go # Ponto de entrada: monta as dependências e inicia a CLI ├── controller/ │ └── controller.go # Orquestra o fluxo entre a entrada do usuário e o modelo ├── view/ │ └── view.go # Entrada e saída no terminal (menus, leitura, exibição) └── model/ └── inventory.go # Regras de negócio e armazenamento dos produtos (map em memória) ``` - **model** — define `Product` e `Inventory`, guardando os produtos em um `map[ProductID]Product` - **view** — responsável por toda interação com o terminal. - **controller** — recebe a opção do usuário e chama as operações do modelo. > Os dados são mantidos apenas em memória: ao encerrar o programa, o estoque é perdido. ## Conceitos aprendidos - **Arquitetura em camadas (MVC)** — separação de responsabilidades entre `model`, `view` e `controller`, mantendo cada parte independente. - **Structs e métodos** — modelagem de dados com `Product`/`Inventory` e métodos (`func (e *Inventory) ...`). - **Maps** — armazenamento em `map[ProductID]Product` para busca, atualização e remoção, o padrão *comma-ok* (`v, ok := m[k]`) e a função embutida `delete(m, chave)`. - **Tipos nomeados** — criação de `type ProductID int` para dar semântica aos identificadores. - **Leitura de entrada** — uso de `bufio.Reader` - **Tratamento de strings** — `strings.TrimSpace` para limpar os espaços e quebras de linhas da entrada e `strconv` (`Atoi`, `ParseFloat`) para converter texto em tipos numéricos. - **Tratamento de erros** — múltiplos retornos `(valor, error)` e verificação com `if err != nil`. - **Formatação de saída** — `fmt.Printf` com verbos como `%d`, `%s` e `%.2f`.