Datenvalidierung in Go: Bibliotheken, Beispiele und Best Practices

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): Werkzeuge, Beispiele und Best Practices



Die Datenvalidierung ist einer der wichtigsten Schritte bei der Entwicklung jeder Webanwendung oder API. In Go (Golang) wird diese Aufgabe dank strenger Typisierung, leistungsstarker Bibliotheken und integrierter Funktionen besonders elegant gelöst. In diesem Artikel werden wir die grundlegenden Ansätze zur Datenprüfung, beliebte Bibliotheken untersuchen und praktische Codebeispiele liefern.



Warum ist Validierung in Go wichtig?

Go wird in nativen Code kompiliert und verfügt nicht über ein integriertes Reflektionssystem wie Python oder JavaScript. Dennoch haben Entwickler mehrere hervorragende Bibliotheken erstellt, die Folgendes ermöglichen:

  • Überprüfung von Strukturfeldern auf Formate (E-Mail, URL, Telefon);
  • Festlegen von Einschränkungen (min, max, required);
  • Erstellen benutzerdefinierter Validatoren für die Geschäftslogik;
  • Integration mit Web-Frameworks (Gin, Echo, Fiber).


1. Die Bibliothek go-playground/validator (die beliebteste)

go-playground/validator ist der De-facto-Standard für die Strukturvalidierung in Go. Es verwendet Tags in den Strukturfeldern und unterstützt über 100 eingebaute Regeln.



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=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 _, e := range err.(validator.ValidationErrors) { fmt.Printf("Feld: %s, Fehler: %s, Wert: %v", e.Field(), e.Tag(), e.Value()) } }}


Ausgabe:

Feld: Name, Fehler: min, Wert: AFeld: Email, Fehler: email, Wert: invalid-emailFeld: Age, Fehler: gte, Wert: 15


2. Die Bibliothek ozzo-validation (Alternative mit Methodenverkettung)

ozzo-validation bietet einen deklarativeren Stil ohne Tags. Es eignet sich für Fälle, in denen die Struktur nicht geändert werden kann oder eine dynamische Validierung erforderlich ist.



package main

import ( "fmt" "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is")

type Product struct { Name string Price float64}

func main() { p := Product{Name: "", Price: -10} err := validation.ValidateStruct(&p, validation.Field(&p.Name, validation.Required, validation.Length(1, 100)), validation.Field(&p.Price, validation.Required, validation.Min(0.01)), ) if err != nil { fmt.Println(err) }}


3. Benutzerdefinierte Validatoren

Häufig sind Prüfungen erforderlich, die nicht durch die eingebauten Regeln abgedeckt werden. Zum Beispiel die Validierung eines Passworts oder die Eindeutigkeit eines Namens.



package main

import ( "fmt" "github.com/go-playground/validator/v10" "unicode")

func passwordValidator(fl validator.FieldLevel) bool { pwd := fl.Field().String() hasUpper := false hasDigit := false for _, ch := range pwd { if unicode.IsUpper(ch) { hasUpper = true } if unicode.IsDigit(ch) { hasDigit = true } } return len(pwd) >= 8 && hasUpper && hasDigit}

type Account struct { Password string `validate:"password"`}

func main() { validate := validator.New() validate.RegisterValidation("password", passwordValidator)

acc := Account{Password: "weak"} err := validate.Struct(acc) if err != nil { fmt.Println("Passwort hat die Validierung nicht bestanden") } else { fmt.Println("Passwort ist korrekt") }}


4. Validierung von HTTP-Anfragen mit Gin

Das Framework Gin verwendet

Empfehlungen