Menu
Coddy logo textTech

Validador de números simple

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 67 de 68.

challenge icon

Desafío

Fácil

Crea un sistema de validación de números que demuestre cómo las interfaces definen contratos de comportamiento, mientras que los errores personalizados proporcionan información significativa cuando la validación falla. Este desafío pondrá a prueba tu capacidad para crear interfaces, implementarlas con tipos personalizados y manejar errores de validación de manera adecuada.

Recibirás dos entradas:

  • Una cadena que contiene números a validar separados por comas (por ejemplo, "45,150,25,200,75")
  • Una cadena que contiene el rango de validación en el formato "min:max" (por ejemplo, "1:100")

Tu tarea es:

  1. Definir una interfaz Validator con un único método: Validate() error
  2. Crear un tipo de error personalizado llamado struct ValidationError con dos campos: Value (int) y Message (string)
  3. Implementar el método Error() string para ValidationError que devuelva el mensaje en el formato: "Validation failed: [message] (value: [value])"
  4. Crear un struct NumberValidator con tres campos: Number (int), Min (int), y Max (int)
  5. Implementar el método Validate() error para NumberValidator que:
    • Devuelva nil si el número está dentro del rango válido (inclusive)
    • Devuelva un ValidationError con el mensaje "number below minimum range" si el número es menor que el mínimo
    • Devuelva un ValidationError con el mensaje "number above maximum range" si el número es mayor que el máximo
  6. Analizar la primera entrada dividiéndola por comas para obtener las cadenas de números individuales
  7. Analizar la segunda entrada dividiéndola por dos puntos para extraer los valores mínimo y máximo
  8. Convertir todos los valores de cadena a enteros usando el paquete strconv
  9. Mostrar el encabezado de validación: "=== NUMBER VALIDATION SYSTEM ==="
  10. Mostrar los parámetros de validación: "Validating numbers in range [min] to [max]"
  11. Para cada número:
    • Crear una instancia de NumberValidator con el número y los valores del rango
    • Llamar al método Validate() en el validador
    • Si la validación pasa (el error es nil), mostrar: "✓ [number] is valid"
    • Si la validación falla (el error no es nil), mostrar: "✗ [error_message]"
  12. Mostrar el resumen de validación:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. Mostrar el mensaje de finalización: "Number validation completed successfully"

Usa el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a enteros y el paquete fmt para la salida formateada. Este desafío demuestra cómo crear sistemas de validación flexibles utilizando interfaces mientras se proporciona información detallada de errores a través de tipos de error personalizados.

Pruébalo tú mismo

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Leer entrada
	var numbersInput string
	var rangeInput string
	fmt.Scanln(&numbersInput)
	fmt.Scanln(&rangeInput)
	
	// Analizar las entradas
	numberStrings := strings.Split(numbersInput, ",")
	rangeParts := strings.Split(rangeInput, ":")
	
	// Convertir los valores del rango a enteros
	min, _ := strconv.Atoi(rangeParts[0])
	max, _ := strconv.Atoi(rangeParts[1])
	
	// TODO: Escribe tu código a continuación
	// 1. Definir la interfaz Validator
	// 2. Crear la estructura ValidationError e implementar el método Error()
	// 3. Crear la estructura NumberValidator e implementar el método Validate()
	// 4. Procesar cada número y validarlo
	// 5. Mostrar los resultados y el resumen
	
	// Mostrar encabezado de validación
	fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
	fmt.Printf("Validating numbers in range %d to %d\n", min, max)
	
	// Procesar cada número aquí
	
	// Mostrar resumen de validación
	fmt.Println("=== VALIDATION SUMMARY ===")
	// Agregar salida del resumen aquí
	
	fmt.Println("Number validation completed successfully")
}

Todas las lecciones de Lógica y Flujo