Validation des données en Go (Golang) : bibliothèques, approches et exemples de code

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) : 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/v10


Exemple 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 : 123


Tags-règles populaires

  • required — champ obligatoire
  • min, max — pour les nombres et les chaînes
  • len — longueur exacte
  • email — vérification d'email
  • url — vérification d'URL
  • gte, lte — supérieur/inférieur ou égal
  • oneof — 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

Recommendations