Golang Implementation
Cadre de validation complet de la longueur des tableaux
Conception de la structure de validation principale
type ArrayValidator struct {
MinLength int
MaxLength int
AllowEmpty bool
StrictType bool
}
Implémentation de la méthode de validation
func (v *ArrayValidator) Validate(arr interface{}) error {
value := reflect.ValueOf(arr)
if value.Kind() != reflect.Slice && value.Kind() != reflect.Array {
return fmt.Errorf("invalid input type")
}
length := value.Len()
switch {
case length == 0 && !v.AllowEmpty:
return errors.New("array cannot be empty")
case length < v.MinLength:
return fmt.Errorf("array too short: minimum %d required", v.MinLength)
case v.MaxLength > 0 && length > v.MaxLength:
return fmt.Errorf("array too long: maximum %d allowed", v.MaxLength)
}
return nil
}
Diagramme du flux de validation
graph TD
A[Input Array] --> B{Type Check}
B -->|Valid| C{Length Check}
B -->|Invalid| D[Return Error]
C -->|Pass| E[Validation Success]
C -->|Fail| F[Return Specific Error]
Techniques de validation avancées
Validation spécifique au type
func validateNumericConstraints(arr []int, constraints ArrayValidator) error {
if err := constraints.Validate(arr); err != nil {
return err
}
for _, num := range arr {
if num < 0 {
return errors.New("negative values not allowed")
}
}
return nil
}
Matrice des stratégies de validation
Type de validation |
Complexité |
Cas d'utilisation |
Longueur de base |
Faible |
Contraintes simples |
Spécifique au type |
Moyenne |
Vérifications numériques/chaînes de caractères |
Règles complexes |
Élevée |
Filtrage avancé |
Modèles de gestion des erreurs
func processUserInput(data []string) error {
validator := &ArrayValidator{
MinLength: 1,
MaxLength: 10,
AllowEmpty: false,
}
if err := validator.Validate(data); err != nil {
log.Printf("Validation failed: %v", err)
return err
}
// Process valid input
return nil
}
- Utilisez la vérification de type au moment de la compilation
- Minimisez l'utilisation de la réflexion (reflection)
- Implémentez des stratégies de retour anticipé
- Mettez en cache les résultats de validation lorsque cela est possible
Exemple d'implémentation pratique
func main() {
userRoles := []string{"admin", "editor"}
validator := &ArrayValidator{
MinLength: 1,
MaxLength: 5,
AllowEmpty: false,
}
if err := validator.Validate(userRoles); err != nil {
fmt.Println("Invalid user roles:", err)
return
}
// Process roles
}
En utilisant ces stratégies d'implémentation, les développeurs utilisant LabEx peuvent créer des mécanismes de validation de tableaux robustes et sûrs en termes de types en Golang avec un surcoût minimal et une flexibilité maximale.