Настраиваемые поля валидатора полей Golang Engineering Components Field Validator, структурные дополнения и настраиваемая проверка

Golang — это быстрый, безопасный и эффективный язык программирования, который широко используется для создания высокопроизводительных распределенных систем. В Golang очень важной концепцией является компонентное программирование. Компонентное программирование может сделать код более ясным и лаконичным, простым в сопровождении и расширении.

В этой статье мы обсудим настраиваемые поля, дополнения к структуре и пользовательскую проверку валидатора поля в инженерных компонентах Golang.

1. Пользовательские поля

В валидаторе мы можем использовать существующие стандартные типы для проверки или использовать пользовательские типы для достижения более гибкой проверки. Вот простой пример:

package main

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

type Age int

func (a Age) Validate(fl validator.FieldLevel) bool {
    return a > 0 && a < 100
}

type User struct {
    Name string `validate:"required"`
    Age  Age    `validate:"required,age"`
}

func main() {
    user := &User{
        Name: "John Doe",
        Age:  120,
    }

    validate := validator.New()
    validate.RegisterValidation("age", Age(0).Validate)
    err := validate.Struct(user)

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

В приведенном выше примере мы определили пользовательский тип с именем Age и добавили к нему метод Validate для проверки. При этом в структуре User мы установили символ метки поля Age на «возраст», а в методе validate.RegisterValidation прописали кастомную функцию проверки.

Далее в основной функции мы создаем экземпляр пользователя и проверяем его. Если значение поля Возраст не соответствует правилам, будет возвращено сообщение об ошибке, в противном случае будет выведено имя, символ метки и сообщение об ошибке каждого поля.

Во-вторых, дополнение структуры

В валидаторе, помимо использования существующих стандартных типов для проверки, также поддерживается использование структур для представления сложных типов данных. Вот простой пример:

package main

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

type Address struct {
    Street  string `validate:"required"`
    City    string `validate:"required"`
    Country string `validate:"required"`
}

type User struct {
    Name      string   `validate:"required"`
    Email     string   `validate:"required,email"`
    Addresses []Address
}

func main() {
    user := &User{
        Name:  "John Doe",
        Email: "[email protected]",
        Addresses: []Address{
            {Street: "123 Main St.", City: "Anytown", Country: "USA"},
            {City: "", Country: ""},
        },
    }

    validate := validator.New()
    err := validate.Struct(user)
    
	if err != nil {
        for _, e := range err.(validator.ValidationErrors) {
            fmt.Println(e.StructField())
            fmt.Println(e.Tag())
            fmt.Println(e.Param())
        }
    }
}

В приведенном выше примере мы определили две структуры Address и User и соответственно проверили поля в этих двух структурах. Среди них структура User содержит поле Addresses, значение которого является срезом типа Address.

Далее в основной функции мы создаем экземпляр пользователя и передаем его методу validate.Struct для проверки. Если проверка не пройдена, будет возвращено сообщение об ошибке; в противном случае будут выведены имя, символ метки и сообщение об ошибке каждого поля.

3. Пользовательская проверка

В валидаторе, помимо использования существующих стандартных типов и структур для проверки, также поддерживается использование пользовательских валидаторов для реализации более гибких правил проверки. Вот простой пример:

package main

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

func validateUsername(fl validator.FieldLevel) bool {
    username := fl.Field().String()
    return len(username) >= 6 && len(username) <= 20
}

type User struct {
    Name     string `validate:"required"`
    Username string `validate:"required,username"`
}

func main() {
    user := &User{
        Name:     "John Doe",
        Username: "john_doe_123",
    }

    validate := validator.New()
    validate.RegisterValidation("username", validateUsername)
    err := validate.Struct(user)

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

В приведенном выше примере мы определили пользовательскую функцию проверки с именем validateUsername и зарегистрировали ее в валидаторе. При этом в структуре User мы устанавливаем символ метки поля Username на «username», указывая на то, что для проверки используется пользовательский валидатор.

Далее в основной функции мы создаем экземпляр пользователя и проверяем его. Если значение поля Имя пользователя не соответствует правилам, будет возвращено сообщение об ошибке, в противном случае будет выведено имя, символ метки и сообщение об ошибке каждого поля.

4. Резюме

В этой статье представлены настраиваемые поля, дополнения к структуре и настраиваемая проверка валидатора поля в главе «Инженерные компоненты Golang». Используя библиотеку валидатора, мы можем легко и эффективно проверять сложные типы данных и повышать надежность и надежность программы. Надеюсь, что эта статья окажется полезной для читателей.

Supongo que te gusta

Origin blog.csdn.net/SMILY12138/article/details/130967739
Recomendado
Clasificación