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 capacidade de criar interfaces, implementá-las com tipos personalizados e lidar adequadamente com erros de validação.

Você receberá duas entradas:

  • Uma string contendo números a serem validados, separados por vírgulas (por exemplo, "45,150,25,200,75")
  • Uma string contendo o intervalo de validação no formato "min:max" (por exemplo, "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 nas vírgulas para obter strings de números individuais
  7. Analisar a segunda entrada dividindo-a nos dois-pontos para extrair os valores mínimo e máximo
  8. Converter todos os valores de string em inteiros usando o pacote strconv
  9. Exibir o cabeçalho da 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 for aprovada (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 a saída formatada. Este desafio demonstra como criar sistemas de validação flexíveis usando interfaces e, ao mesmo tempo, fornecer informações detalhadas sobre erros 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

Pratique por conta própria: Compilador de Go online