Пример проверки (валидации) значений в Go
Одним из серьезных недостатков безопасности в приложениях является отсутствие проверки входных данных от пользователя. В идеале, каждое значение, принимаемое от пользователя в том или ином виде, должно быть проверенно, что в дальнейшем сильно снизит вероятность некорректного действия. Хорошим тоном будет проверять корректность всех входных данных.
Достойной библиотекой на go
, которая помогает проверять значения данных, является validator.
Небольшой список уникальных особенностей, по словам разработчиков:
- Проверка отдельных значений и целых структур с использованием меток (tag) проверки или пользовательских валидаторов.
- Проверка значений на любом или всех уровнях многомерного среза (slice), массива (array) или карты (map).
- Возможность проверки как ключа карты (map) так и значения.
- Работает с интерфейсами, определяя их базовый тип перед проверкой.
- Обрабатывает пользовательские типы значений, такие как sql driver Valuer.
- Возможность сопоставлять несколько проверок с одной меткой (tag) для упрощения определения проверок в структурах, используя
alias
меток проверок. - Настраиваемые сообщения об ошибках, поддерживающих
i18n
.
Пример объявления структуры с метками для последующей проверки
type User struct {
FirstName string `validate:"required"`
LastName string `validate:"required"`
Age uint8 `validate:"gte=0,lte=130"`
Email string `validate:"required,email"`
Gender string `validate:"oneof=male female prefer_not_to`
FavouriteColor string `validate:"iscolor"` // alias for 'hexcolor|rgb|rgba|hsl|hsla'
}
type User struct {
FirstName string `validate:"required"`
LastName string `validate:"required"`
Age uint8 `validate:"gte=0,lte=130"`
Email string `validate:"required,email"`
Gender string `validate:"oneof=male female prefer_not_to`
FavouriteColor string `validate:"iscolor"` // alias for 'hexcolor|rgb|rgba|hsl|hsla'
}
Пример проверки и обоработки возможных ошибок
err := validate.Struct(user)
if err != nil {
if _, ok := err.(*validator.InvalidValidationError); ok {
fmt.Println(err)
return
}
for _, err := range err.(validator.ValidationErrors) {
fmt.Println(err.Namespace())
fmt.Println(err.Field())
fmt.Println(err.StructNamespace())
fmt.Println(err.StructField())
fmt.Println(err.Tag())
fmt.Println(err.ActualTag())
fmt.Println(err.Kind())
fmt.Println(err.Type())
fmt.Println(err.Value())
fmt.Println(err.Param())
fmt.Println()
}
return
}
err := validate.Struct(user)
if err != nil {
if _, ok := err.(*validator.InvalidValidationError); ok {
fmt.Println(err)
return
}
for _, err := range err.(validator.ValidationErrors) {
fmt.Println(err.Namespace())
fmt.Println(err.Field())
fmt.Println(err.StructNamespace())
fmt.Println(err.StructField())
fmt.Println(err.Tag())
fmt.Println(err.ActualTag())
fmt.Println(err.Kind())
fmt.Println(err.Type())
fmt.Println(err.Value())
fmt.Println(err.Param())
fmt.Println()
}
return
}
Коментарии
Остались вопросы, появились идеи для обсуждения или просто хотите оставить отзыв? Буду рад любой обратной связи!
Вместо авторизации в приложении giscus , вы также можете оставлять комментарии непосредственно на GitHub, с которым связанна данная ветка комментариев.
Похожие записи
Доступ к Docker Hub
Обход блокировки досутпа к Docker Hub с помощью прокси-сервера
Комментарии в блоге с Giscus
Система комментариев на основе GitHub Discussions.