Walidacja Go Structs za pomocą Govalidator

Walidacja Go Structs za pomocą Govalidator

Struktury to jeden z podstawowych i powszechnie używanych typów danych w języku programowania Go. Wiele pakietów o różnych funkcjach, od pakietów baz danych po ORM, a niektóre frameworki sieciowe używają struktur do łatwego analizowania danych i innych operacji.

Walidacja struktury jest częstym zadaniem w Go, a pakiet walidatora Go zapewnia prosty i skuteczny sposób sprawdzania poprawności struktur w twoich projektach.

Co to jest pakiet Go Validator

podgląd github dla pakietu walidatora

Pakiet walidatora Go implementuje walidację wartości dla struktury i poszczególnych pól w oparciu o określone tagi w deklaracji struktury.

Pakiet walidatora Go zapewnia funkcje sprawdzania poprawności między polami i strukturami za pomocą znaczników, fragmentów, tablic i nurkowania map, które umożliwiają wielowymiarowe sprawdzanie poprawności pól, sprawdzanie poprawności pól niestandardowych, wyodrębnianie niestandardowych nazw pól, konfigurowalne komunikaty o błędach i obsługa popularnego frameworka Gin jako domyślnego walidatora pakietu.

Uruchom jedno z tych poleceń w terminalu katalogu roboczego, aby zainstalować pakiet sprawdzania poprawności .

go get gopkg.in/go-playground/validator.v9
go get github.com/go-playground/validator/v10

Wersje są sufiksem adresu URL. Pierwsze polecenie instaluje wersję 9, a drugie wersję 10 pakietu.

Po zainstalowaniu pakietu możesz zaimportować pakiet do swoich projektów w zależności od zainstalowanej wersji.

import (
    "gopkg.in/go-playground/validator.v9"
)

Możesz teraz przystąpić do korzystania z pakietu walidatora Go. Jeśli wystąpią jakiekolwiek problemy z instalacją, spróbuj ponownie zainstalować/zaktualizować do najnowszej wersji Go.

Walidacja struktur za pomocą pakietu Validator

Musisz utworzyć instancję struktury validator.Validate , zdefiniuj strukturę, którą chcesz zweryfikować, używając znaczników sprawdzania poprawności, aby określić reguły sprawdzania poprawności dla pól.

Oto jak możesz utworzyć instancję struktury validator.Validate .

func main() {
    validate: = validator.New()
}

Możesz zdefiniować strukturę, którą chcesz zweryfikować, określając tagi dla pól, ustawiając w ten sposób reguły sprawdzania poprawności. Znaczniki sprawdzania poprawności to specjalne adnotacje definicji pól struktury, które określają reguły.

Oto zwykła struktura do sprawdzania poprawności.

type User struct {
    Name string
    Age int
    Email string
}

Oto przykład struktury, gotowy do sprawdzenia poprawności.

type User struct {
    Name string `validate:"required"`
    Age int `validate:"gte=0,lte=130"`
    Email string `validate:"required,email"`
}

W tym przykładzie pole Nazwa zostało określone zgodnie z wymaganiami podczas tworzenia wystąpienia, pole Wiek musi być większe lub równe 0 i mniejsze lub równe 130, a pole E-mail jest wymagane i musi być prawidłowym adresem e-mail podczas tworzenia wystąpienia.

W pakiecie walidatora Go dostępne są różne znaczniki sprawdzania poprawności, w tym znaczniki wymaganych pól, wartości minimalnych i maksymalnych oraz wyrażeń regularnych. Pełną listę dostępnych znaczników walidacji można znaleźć w dokumentacji pakietu walidatora Go.

Po zdefiniowaniu struktury, którą chcesz zweryfikować, i określeniu reguł sprawdzania poprawności dla każdego pola, możesz użyć metody Struct struktury validator.Validate , aby sprawdzić poprawność struktury.

user: = User{
    // Name not instantiated
    Age: 3990000,
    Email: "john@example.com",
}
// note that the Name and Age fields fail the validation

err: = validate.Struct(user)
if err! = nil {
    // Struct is invalid
}

Metoda Struct zwraca błąd, jeśli występują błędy sprawdzania poprawności i można obsłużyć błąd na podstawie operacji.

Dostęp do tych błędów można uzyskać za pomocą metody ValidationErrors błędu.

if err! = nil {
    for _, err: = range err.(validator.ValidationErrors) {
        fmt.Println(err.Field(), err.Tag())
    }
}

Metoda ValidationErrors zwróci nazwę każdego pola z błędem sprawdzania poprawności oraz tag sprawdzania poprawności, który spowodował błąd.

wyjście błędu

Definiowanie niestandardowych tagów walidacji

Możesz także zdefiniować niestandardowe tagi sprawdzania poprawności, jeśli określone wymagania dotyczące sprawdzania poprawności nie są częścią wbudowanych tagów.

Możesz użyć metody RegisterValidation struktury validator.Validate . Metoda RegisterValidation przyjmuje dwa argumenty; nazwa znacznika sprawdzania poprawności i funkcja sprawdzania poprawności. Funkcja sprawdzania poprawności jest funkcją wywołania zwrotnego, która jest wywoływana dla każdego pola z niestandardowym znacznikiem sprawdzania poprawności, a funkcja musi zwracać wartość true , jeśli pole jest prawidłowe, i wartość false , jeśli jest inaczej.

Oto przykładowa definicja niestandardowego tagu sprawdzania poprawności. Znacznik sprawdza poprawność pól dla liczb parzystych.

validate.RegisterValidation("even", func(fl validator.FieldLevel) bool {
    // Try to get the field value as an int
    value, ok: = fl.Field().Interface().(int)
    if! ok {
        // If the field value is not an int, return false
        return false
    }
    // Return true if the value is even, false, otherwise
    return value % 2 == 0
})

Kod definiuje niestandardowy znacznik sprawdzania poprawności nawet przy użyciu metody RegisterValidation struktury validator.Validate . Znacznik sprawdzania poprawności został zdefiniowany przy użyciu funkcji, która pobiera pojedynczy argument typu validator.FieldLevel.

Możesz teraz używać niestandardowego znacznika sprawdzania poprawności w definicjach struktur w taki sam sposób, jak w przypadku wbudowanych znaczników sprawdzania poprawności.

type MyStruct struct {
    Value int `validate:"even"`
}

Struktury do zrobienia to więcej

Struktury są obywatelami pierwszej klasy w Go, a dzięki strukturom można zrobić tak wiele. Jeśli znasz języki czysto obiektowe, możesz używać struktur Go do operowania na danych, tak jak na klasach.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *