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 gestionar adecuadamente los errores de validación.

Recibirás dos entradas:

  • Una cadena que contiene números para validar, separados por comas (por ejemplo, "45,150,25,200,75")
  • Una cadena que contiene el rango de validación con 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 estructura ValidationError con dos campos: Value (int) y Message (string)
  3. Implementar el método Error() string para ValidationError, que devuelva el mensaje con el formato: "Validation failed: [message] (value: [value])"
  4. Crear una estructura 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 separándola por comas para obtener cadenas de números individuales
  7. Analizar la segunda entrada separándola por dos puntos para extraer los valores mínimo y máximo
  8. Convertir todos los valores de cadena a enteros utilizando 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 es exitosa (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 separar las cadenas de entrada, el paquete strconv para convertir las cadenas a enteros y el paquete fmt para generar una salida con formato. Este desafío demuestra cómo crear sistemas de validación flexibles utilizando interfaces y, al mismo tiempo, proporcionar información detallada sobre los errores mediante 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

Practica por tu cuenta: Compilador de Go online