Пример проверки (валидации) значений в Go

Одним из серьезных недостатков безопасности в приложениях является отсутствие проверки входных данных от пользователя. В идеале, каждое значение, принимаемое от пользователя в том или ином виде, должно быть проверенно, что в дальнейшем сильно снизит вероятность некорректного действия. Хорошим тоном будет проверять корректность всех входных данных.

Достойной библиотекой на go, которая помогает проверять значения данных, является validator.

Небольшой список уникальных особенностей, по словам разработчиков:

  • Проверка отдельных значений и целых структур с использованием меток (tag) проверки или пользовательских валидаторов.
  • Проверка значений на любом или всех уровнях многомерного среза (slice), массива (array) или карты (map).
  • Возможность проверки как ключа карты (map) так и значения.
  • Работает с интерфейсами, определяя их базовый тип перед проверкой.
  • Обрабатывает пользовательские типы значений, такие как sql driver Valuer.
  • Возможность сопоставлять несколько проверок с одной меткой (tag) для упрощения определения проверок в структурах, используя alias меток проверок.
  • Настраиваемые сообщения об ошибках, поддерживающих i18n.

Пример объявления структуры с метками для последующей проверки

main.go
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'
}

Пример проверки и обоработки возможных ошибок

main.go
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.