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». Используя библиотеку валидатора, мы можем легко и эффективно проверять сложные типы данных и повышать надежность и надежность программы. Надеюсь, что эта статья окажется полезной для читателей.