Menu
Coddy logo textTech

Validador de Números Simples

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 67 de 68.

challenge icon

Desafio

Fácil

Crie 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 é:

  1. Definir uma interface Validator com um único método: Validate() error
  2. Criar um tipo de erro personalizado chamado struct ValidationError com dois campos: Value (int) e Message (string)
  3. Implementar o método Error() string para ValidationError que retorna a mensagem no formato: "Validation failed: [message] (value: [value])"
  4. Criar uma struct NumberValidator com três campos: Number (int), Min (int) e Max (int)
  5. Implementar o método Validate() error para NumberValidator que:
    • Retorna nil se o número estiver dentro do intervalo válido (inclusive)
    • Retorna um ValidationError com a mensagem "number below minimum range" se o número for menor que o mínimo
    • Retorna um ValidationError com a mensagem "number above maximum range" se o número for maior que o máximo
  6. Analisar a primeira entrada dividindo-a por vírgulas para obter as strings de números individuais
  7. Analisar a segunda entrada dividindo-a por dois-pontos para extrair os valores mínimo e máximo
  8. Converter todos os valores de string para inteiros usando o pacote strconv
  9. Exibir o cabeçalho de validação: "=== NUMBER VALIDATION SYSTEM ==="
  10. Exibir os parâmetros de validação: "Validating numbers in range [min] to [max]"
  11. Para cada número:
    • Criar uma instância de NumberValidator com 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]"
  12. Exibir o resumo da validação:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. 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