Validation des données en Go (Golang) : bibliothèques et exemples pratiques
La validation des données est l’un des aspects clés du développement d’applications web et d’API fiables en Go. Sans une vérification correcte des données entrantes, l’application devient vulnérable aux erreurs, aux saisies incorrectes et aux attaques. Dans cet article, nous examinerons trois bibliothèques populaires pour la validation en Go : go-playground/validator, ozzo-validation et govalidator, et nous analyserons des exemples de leur utilisation.
Pourquoi la validation est-elle nécessaire en Go ?
Go est un langage fortement typé, mais cela ne protège pas des erreurs logiques dans les données : chaînes vides, emails incorrects, nombres hors plage autorisée. La validation permet :
- De garantir l’intégrité des données à l’entrée ;
- De simplifier la gestion des erreurs ;
- D’améliorer la sécurité de l’application ;
- De réduire la quantité de code boilerplate.
1. go-playground/validator — le standard de référence
La bibliothèque la plus populaire (plus de 15k étoiles sur GitHub). Elle permet de décrire les règles de validation directement dans les tags des structures.
Installation
go get github.com/go-playground/validator/v10Exemple de base
package main
import ( "fmt" "github.com/go-playground/validator/v10")
type User struct { Name string `validate:"required,min=3,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 _, err := range err.(validator.ValidationErrors) { fmt.Printf("Champ : %s, Erreur : %s", err.Field(), err.Tag()) } }}Validateurs personnalisés
validate.RegisterValidation("is-valid-username", func(fl validator.FieldLevel) bool { return len(fl.Field().String()) >= 5})
type Login struct { Username string `validate:"required,is-valid-username"`}2. ozzo-validation — flexibilité et lisibilité
La bibliothèque ozzo-validation propose une interface fluide pour construire des règles. Elle convient bien aux règles métier complexes.
Installation
go get github.com/go-ozzo/ozzo-validation/v4Exemple d’utilisation
package main
import ( "fmt" validation "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is")
type Order struct { ProductID string Quantity int Email string}
func (o Order) Validate() error { return validation.ValidateStruct(&o, validation.Field(&o.ProductID, validation.Required, validation.Length(5, 20)), validation.Field(&o.Quantity, validation.Required, validation.Min(1), validation.Max(100)), validation.Field(&o.Email, validation.Required, is.Email), )}
func main() { order := Order{ProductID: "AB", Quantity: 0, Email: "bad"} err := order.Validate() if err != nil { fmt.Println(err) }}Caractéristiques
- Absence de tags — les règles sont écrites dans le code ;
- Intégration facile avec les types personnalisés ;
- Prise en charge de la validation conditionnelle.
3. govalidator — simplicité pour les petits projets
Bibliothèque légère avec un ensemble de fonctions prêtes à l’emploi pour vérifier les chaînes, les nombres et les structures.
Installation
go get github.com/asaskevich/govalidatorExemple
package main
import ( "fmt" "github.com/asaskevich/govalidator")
func main() { // Vérification de chaînes fmt.Println(govalidator.IsEmail("test@example.com")) // true fmt.Println(govalidator.IsURL("https://pythonlib.ru")) // true fmt.Println(govalid Aussi dans la bibliothèque
gRPC pour Swift (iOS/macOS) : bibliothèques, configuration et exemples de code
config Rust : guide complet avec exemples pratiques
KeychainAccess Swift : guide complet avec exemples
Génération Swagger/OpenAPI pour Swift : outils et exemples de code
Travailler avec CSV en TypeScript : bibliothèques et exemples de code