Validation des données en Go : bibliothèques, exemples et bonnes pratiques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Validation des données en Go (Golang) : outils, exemples et bonnes pratiques



La validation des données est l'une des étapes clés du développement de toute application web ou API. En Go (Golang), cette tâche est résolue de manière particulièrement élégante grâce au typage strict, aux bibliothèques puissantes et aux fonctionnalités intégrées. Dans cet article, nous examinerons les principales approches de vérification des données, les bibliothèques populaires et fournirons des exemples pratiques de code.



Pourquoi la validation en Go est-elle nécessaire ?

Go est compilé en code natif et ne dispose pas d'un système de réflexion intégré comme Python ou JavaScript. Cependant, les développeurs ont créé plusieurs excellentes bibliothèques qui permettent de :

  • Vérifier les champs des structures par rapport aux formats (email, URL, téléphone) ;
  • Définir des contraintes (min, max, required) ;
  • Créer des validateurs personnalisés pour la logique métier ;
  • S'intégrer avec les frameworks web (Gin, Echo, Fiber).


1. Bibliothèque go-playground/validator (la plus populaire)

go-playground/validator est la norme de facto pour la validation des structures en Go. Elle utilise des tags dans les champs des structures et prend en charge plus de 100 règles intégrées.



package main

import ( "fmt" "github.com/go-playground/validator/v10")

type User struct { Name string `validate:"required,min=2,max=50"` Email string `validate:"required,email"` Age int `validate:"gte=18,lte=120"`}

func main() { validate := validator.New() user := User{ Name: "A", Email: "invalid-email", Age: 15, } err := validate.Struct(user) if err != nil { for _, e := range err.(validator.ValidationErrors) { fmt.Printf("Champ : %s, Erreur : %s, Valeur : %v", e.Field(), e.Tag(), e.Value()) } }}


Sortie :

Champ : Name, Erreur : min, Valeur : AChamp : Email, Erreur : email, Valeur : invalid-emailChamp : Age, Erreur : gte, Valeur : 15


2. Bibliothèque ozzo-validation (alternative avec chaînage d'appels)

ozzo-validation propose un style plus déclaratif sans tags. Elle convient aux cas où la structure ne peut pas être modifiée ou lorsqu'une validation dynamique est nécessaire.



package main

import ( "fmt" "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is")

type Product struct { Name string Price float64}

func main() { p := Product{Name: "", Price: -10} err := validation.ValidateStruct(&p, validation.Field(&p.Name, validation.Required, validation.Length(1, 100)), validation.Field(&p.Price, validation.Required, validation.Min(0.01)), ) if err != nil { fmt.Println(err) }}


3. Validateurs personnalisés

Il est souvent nécessaire d'effectuer des vérifications non prévues par les règles intégrées. Par exemple, la validation d'un mot de passe ou de l'unicité d'un nom.



package main

import ( "fmt" "github.com/go-playground/validator/v10" "unicode")

func passwordValidator(fl validator.FieldLevel) bool { pwd := fl.Field().String() hasUpper := false hasDigit := false for _, ch := range pwd { if unicode.IsUpper(ch) { hasUpper = true } if unicode.IsDigit(ch) { hasDigit = true } } return len(pwd) >= 8 && hasUpper && hasDigit}

type Account struct { Password string `validate:"password"`}

func main() { validate := validator.New() validate.RegisterValidation("password", passwordValidator)

acc := Account{Password: "weak"} err := validate.Struct(acc) if err != nil { fmt.Println("Le mot de passe n'a pas passé la validation") } else { fmt.Println("Le mot de passe est correct") }}


4. Validation des requêtes HTTP avec Gin

Le framework Gin utilise

Recommendations