Datenvalidierung in Go (Golang): Bibliotheken, Ansätze und Codebeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenvalidierung in Go (Golang): Vollständige Anleitung zu Bibliotheken und Ansätzen



Datenvalidierung ist ein kritisch wichtiger Teil jeder Webanwendung, API oder jedes Mikrodienstes. In Go (Golang) wird diese Aufgabe sowohl mit Standardmitteln als auch mit leistungsstarken Drittanbieter-Bibliotheken gelöst. In diesem Artikel werden wir die wichtigsten Ansätze, beliebte Bibliotheken und praktische Codebeispiele behandeln.



Warum ist Validierung in Go notwendig?

Go ist eine streng typisierte Sprache, was bereits einen gewissen Schutz vor ungültigen Daten bietet. Typen überprüfen jedoch keine Geschäftsregeln: Eine E-Mail muss ein „@“ enthalten, das Alter muss im Bereich 0–120 liegen, ein Passwort muss eine Mindestlänge haben. Ohne Validierung riskieren Sie:

  • SQL-Injection und XSS-Angriffe
  • Ungültige Daten in der Datenbank
  • Unerwartete Panics und Laufzeitfehler


Integrierte Validierungsmöglichkeiten

Die einfachste Validierung erfolgt „manuell“ in Funktionen. Beispiel:

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}

Dieser Ansatz ist einfach, wird aber bei komplexen Strukturen umständlich und schwer wartbar. Daher hat die Go-Community spezialisierte Bibliotheken entwickelt.



1. go-playground/validator — der De-facto-Standard

Link: github.com/go-playground/validator/v10

Dies ist die beliebteste Validierungsbibliothek in Go (über 15k Sterne auf GitHub). Sie verwendet Struktur-Tags (struct tags) zur deklarativen Beschreibung von Regeln.



Installation

go get github.com/go-playground/validator/v10


Anwendungsbeispiel

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("Feld: %s, Regel: %s, Wert: %v", e.Field(), e.Tag(), e.Value()) } }}


Ausgabe:

Feld: Name, Regel: min, Wert: AFeld: Email, Regel: email, Wert: not-emailFeld: Age, Regel: lte, Wert: 200Feld: Password, Regel: min, Wert: 123


Beliebte Tag-Regeln

  • required — Feld ist erforderlich
  • min, max — für Zahlen und Zeichenketten
  • len — exakte Länge
  • email — E-Mail-Überprüfung
  • url — URL-Überprüfung
  • gte, lte — größer/kleiner oder gleich
  • oneof — einer der Werte (oneof=admin user)


Benutzerdefinierte Validatoren

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 — Alternative mit Verkettungen

Link: github.com/go-ozzo/ozzo-validation/v4

Diese Bibliothek bietet einen eher „Go-idiomatischen“ Ansatz: Regeln werden über Funktionen und nicht über Tags festgelegt. Dies bietet mehr Flexibilität und Lesbarkeit.



Beispiel

package main

import ( "fm

Empfehlungen