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/v10Anwendungsbeispiel
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: 123Beliebte Tag-Regeln
required— Feld ist erforderlichmin,max— für Zahlen und Zeichenkettenlen— exakte Längeemail— E-Mail-Überprüfungurl— URL-Überprüfunggte,lte— größer/kleiner oder gleichoneof— 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 Auch in der Bibliothek
Autorisierung und Authentifizierung in PHP: Vollständiger Leitfaden mit Beispielen
Arbeiten mit Daten in Swift: Foundation und DateFormatter
Arbeiten mit CSV in C# (.NET): Vollständige Anleitung
CsvHelper für C# (.NET): Komplettguide mit Beispielen