Validateur de nombres simple
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 67 sur 68.
Défi
FacileCréez un système de validation de nombres qui démontre comment les interfaces définissent des contrats de comportement tandis que les erreurs personnalisées fournissent un retour d'information significatif en cas d'échec de la validation. Ce défi testera votre capacité à créer des interfaces, à les implémenter avec des types personnalisés et à gérer les erreurs de validation de manière appropriée.
Vous recevrez deux entrées :
- Une chaîne contenant des nombres à valider séparés par des virgules (par exemple,
"45,150,25,200,75") - Une chaîne contenant la plage de validation au format
"min:max"(par exemple,"1:100")
Votre tâche consiste à :
- Définir une interface
Validatoravec une seule méthode :Validate() error - Créer un type d'erreur personnalisé appelé structure
ValidationErroravec deux champs :Value(int) etMessage(string) - Implémenter la méthode
Error() stringpourValidationErrorqui renvoie le message au format :"Validation failed: [message] (value: [value])" - Créer une structure
NumberValidatoravec trois champs :Number(int),Min(int) etMax(int) - Implémenter la méthode
Validate() errorpourNumberValidatorqui :- Renvoie
nilsi le nombre est dans la plage valide (inclusive) - Renvoie une
ValidationErroravec le message"number below minimum range"si le nombre est inférieur au minimum - Renvoie une
ValidationErroravec le message"number above maximum range"si le nombre est supérieur au maximum
- Renvoie
- Analyser la première entrée en la divisant par des virgules pour obtenir des chaînes de nombres individuelles
- Analyser la deuxième entrée en la divisant par des deux-points pour extraire les valeurs minimale et maximale
- Convertir toutes les valeurs de chaîne en entiers à l'aide du package
strconv - Afficher l'en-tête de validation :
"=== NUMBER VALIDATION SYSTEM ===" - Afficher les paramètres de validation :
"Validating numbers in range [min] to [max]" - Pour chaque nombre :
- Créer une instance de
NumberValidatoravec le nombre et les valeurs de plage - Appeler la méthode
Validate()sur le validateur - Si la validation réussit (l'erreur est
nil), afficher :"✓ [number] is valid" - Si la validation échoue (l'erreur n'est pas
nil), afficher :"✗ [error_message]"
- Créer une instance de
- Afficher le résumé de la validation :
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- Afficher le message de fin :
"Number validation completed successfully"
Utilisez le package strings pour diviser les chaînes d'entrée, le package strconv pour convertir les chaînes en entiers et le package fmt pour la sortie formatée. Ce défi démontre comment créer des systèmes de validation flexibles à l'aide d'interfaces tout en fournissant des informations d'erreur détaillées via des types d'erreur personnalisés.
Essayez vous-même
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Lire l'entrée
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// Analyser les entrées
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// Convertir les valeurs de la plage en entiers
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: Écrivez votre code ci-dessous
// 1. Définir l'interface Validator
// 2. Créer la structure ValidationError et implémenter la méthode Error()
// 3. Créer la structure NumberValidator et implémenter la méthode Validate()
// 4. Traiter chaque nombre et le valider
// 5. Afficher les résultats et le résumé
// Afficher l'en-tête de validation
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// Traiter chaque nombre ici
// Afficher le résumé de la validation
fmt.Println("=== VALIDATION SUMMARY ===")
// Ajouter la sortie du résumé ici
fmt.Println("Number validation completed successfully")
}Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements