Validation des données en Go (Golang) : guide complet des bibliothèques et approches
La validation des données est une partie essentielle de toute application web, API ou microservice. En Go (Golang), cette tâche est résolue à la fois par des moyens standards et par de puissantes bibliothèques tierces. Dans cet article, nous analyserons les principales approches, les bibliothèques populaires et fournirons des exemples pratiques de code.
Pourquoi la validation est-elle nécessaire en Go ?
Go est un langage fortement typé, ce qui offre déjà une certaine protection contre les données incorrectes. Cependant, les types ne vérifient pas les règles métier : un email doit contenir « @ », l'âge doit être compris entre 0 et 120, le mot de passe doit avoir une longueur minimale. Sans validation, vous risquez d'obtenir :
- Des injections SQL et des attaques XSS
- Des données incorrectes dans la base de données
- Des paniques inattendues et des erreurs d'exécution
Moyens de validation intégrés
La validation la plus simple se fait « à la main » dans des fonctions. Exemple :
type User struct { Name string Email string Age int}
func ValidateUser(u User) error { if u.Name == "" { return errors.New("name is required") } if !strings.Contains(u.Email, "@") { return errors.New("invalid email") } if u.Age < 0 || u.Age > 150 { return errors.New("age must be between 0 and 150") } return nil}Cette approche est simple, mais pour des structures complexes, elle devient lourde et difficile à maintenir. C'est pourquoi la communauté Go a créé des bibliothèques spécialisées.
1. go-playground/validator — le standard de facto
Lien : github.com/go-playground/validator/v10
C'est la bibliothèque de validation la plus populaire en Go (plus de 15k étoiles sur GitHub). Elle utilise les tags de structure (struct tags) pour décrire les règles de manière déclarative.
Installation
go get github.com/go-playground/validator/v10Exemple d'utilisation
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=0,lte=150"` Password string `validate:"required,min=8"`}
func main() { validate := validator.New()
user := User{ Name: "A", Email: "not-email", Age: 200, Password: "123", }
err := validate.Struct(user) if err != nil { for _, e := range err.(validator.ValidationErrors) { fmt.Printf("Champ : %s, règle : %s, valeur : %v", e.Field(), e.Tag(), e.Value()) } }}Sortie :
Champ : Name, règle : min, valeur : AChamp : Email, règle : email, valeur : not-emailChamp : Age, règle : lte, valeur : 200Champ : Password, règle : min, valeur : 123Tags-règles populaires
required— champ obligatoiremin,max— pour les nombres et les chaîneslen— longueur exacteemail— vérification d'emailurl— vérification d'URLgte,lte— supérieur/inférieur ou égaloneof— une des valeurs (oneof=admin user)
Validateurs personnalisés
validate.RegisterValidation("is-odd", func(fl validator.FieldLevel) bool { return fl.Field().Int()%2 != 0})
type MyStruct struct { Number int `validate:"is-odd"`}2. ozzo-validation — une alternative avec chaînage
Lien : github.com/go-ozzo/ozzo-validation/v4
Cette bibliothèque propose une approche plus « idiomatique Go » : les règles sont définies via des fonctions, et non des tags. Cela offre une plus grande flexibilité et lisibilité.
Exemple
package main
import ( "fm Aussi dans la bibliothèque
Polly pour C# (.NET) : guide complet avec exemples
Carthage Swift : guide complet avec exemples
Travailler avec les dates en JavaScript (Node.js) : les meilleures bibliothèques