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.
Desafío
FácilCrea 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:
- Definir una interfaz
Validatorcon un único método:Validate() error - Crear un tipo de error personalizado llamado struct
ValidationErrorcon dos campos:Value(int) yMessage(string) - Implementar el método
Error() stringparaValidationErrorque devuelva el mensaje en el formato:"Validation failed: [message] (value: [value])" - Crear un struct
NumberValidatorcon tres campos:Number(int),Min(int), yMax(int) - Implementar el método
Validate() errorparaNumberValidatorque:- Devuelva
nilsi el número está dentro del rango válido (inclusive) - Devuelva un
ValidationErrorcon el mensaje"number below minimum range"si el número es menor que el mínimo - Devuelva un
ValidationErrorcon el mensaje"number above maximum range"si el número es mayor que el máximo
- Devuelva
- Analizar la primera entrada dividiéndola por comas para obtener las cadenas de números individuales
- Analizar la segunda entrada dividiéndola por dos puntos para extraer los valores mínimo y máximo
- Convertir todos los valores de cadena a enteros usando el paquete
strconv - Mostrar el encabezado de validación:
"=== NUMBER VALIDATION SYSTEM ===" - Mostrar los parámetros de validación:
"Validating numbers in range [min] to [max]" - Para cada número:
- Crear una instancia de
NumberValidatorcon 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]"
- Crear una instancia de
- Mostrar el resumen de validación:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- 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
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos