Validador de Números Simples
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 67 de 68.
Desafio
FácilCrie um sistema de validação de números que demonstre como as interfaces definem contratos de comportamento, enquanto erros personalizados fornecem feedback significativo quando a validação falha. Este desafio testará sua habilidade de criar interfaces, implementá-las com tipos personalizados e lidar com erros de validação adequadamente.
Você receberá duas entradas:
- Uma string contendo números para validar separados por vírgulas (ex:
"45,150,25,200,75") - Uma string contendo o intervalo de validação no formato
"min:max"(ex:"1:100")
Sua tarefa é:
- Definir uma interface
Validatorcom um único método:Validate() error - Criar um tipo de erro personalizado chamado struct
ValidationErrorcom dois campos:Value(int) eMessage(string) - Implementar o método
Error() stringparaValidationErrorque retorna a mensagem no formato:"Validation failed: [message] (value: [value])" - Criar uma struct
NumberValidatorcom três campos:Number(int),Min(int) eMax(int) - Implementar o método
Validate() errorparaNumberValidatorque:- Retorna
nilse o número estiver dentro do intervalo válido (inclusive) - Retorna um
ValidationErrorcom a mensagem"number below minimum range"se o número for menor que o mínimo - Retorna um
ValidationErrorcom a mensagem"number above maximum range"se o número for maior que o máximo
- Retorna
- Analisar a primeira entrada dividindo-a por vírgulas para obter as strings de números individuais
- Analisar a segunda entrada dividindo-a por dois-pontos para extrair os valores mínimo e máximo
- Converter todos os valores de string para inteiros usando o pacote
strconv - Exibir o cabeçalho de validação:
"=== NUMBER VALIDATION SYSTEM ===" - Exibir os parâmetros de validação:
"Validating numbers in range [min] to [max]" - Para cada número:
- Criar uma instância de
NumberValidatorcom o número e os valores do intervalo - Chamar o método
Validate()no validador - Se a validação passar (o erro for
nil), exibir:"✓ [number] is valid" - Se a validação falhar (o erro não for
nil), exibir:"✗ [error_message]"
- Criar uma instância de
- Exibir o resumo da validação:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- Exibir a mensagem de conclusão:
"Number validation completed successfully"
Use o pacote strings para dividir as strings de entrada, o pacote strconv para converter strings em inteiros e o pacote fmt para saída formatada. Este desafio demonstra como criar sistemas de validação flexíveis usando interfaces, fornecendo informações detalhadas de erro por meio de tipos de erro personalizados.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Ler a entrada
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// Analisar as entradas
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// Converter valores do intervalo para inteiros
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: Escreva seu código abaixo
// 1. Definir a interface Validator
// 2. Criar a struct ValidationError e implementar o método Error()
// 3. Criar a struct NumberValidator e implementar o método Validate()
// 4. Processar cada número e validá-lo
// 5. Exibir os resultados e o resumo
// Exibir cabeçalho de validação
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// Processar cada número aqui
// Exibir resumo da validação
fmt.Println("=== VALIDATION SUMMARY ===")
// Adicionar saída do resumo aqui
fmt.Println("Number validation completed 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 Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos