Лучшая проверка структуры в Golang

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

Существует несколько методов проверки структур и типов в Golang. Один из самых перспективных методов - это проверка с помощью тегов и отражения.

Самая популярная реализация такого метода - пакет go-plays / validator. Однако и здесь есть ограничения. В этой статье я собираюсь представить свой новый пакет Go, чтобы улучшить проверку структуры / типа с помощью тегов и отражения, и объяснить, почему это лучше.

Встречайте пакет dealancer / validate!

Более приятный синтаксис

Допустим, у нас есть сложное поле в структуре.

type S struct {
    Complex []map[string]int
}

Чтобы проверить это, пакет dealancer / validate предоставляет простой для чтения и реализации синтаксис.

`validate:"empty=false > empty=false [empty=false] > ne=0"`

Те же функциональные возможности в go-plays / validator могут быть достигнуты с помощью следующего синтаксиса.

`validate:"required,dive,required,dive,keys,required,endkeys,dive,ne=0"`

Явная проверка указателя

Допустим, у нас есть поле указателя в структуре.

type S struct {
   Field *string
}

Чтобы проверить это, пакет dealancer / validate предоставляет простой способ.

`validate:"nil=false > empty=false"`

Не существует однозначного способа проверить одну и ту же структуру в go-Playground / validator. Следующие действия не сработают, потому что required применяется к указателю два раза.

`validate:"required,required"`

Но есть обходной путь, который выглядит странно.

`validate:"gt=0,required"`

Приоритет знакомых логических операторов

В пакете dealancer / validate логическое И & больше предшествует логическому ИЛИ |, поэтому вы можете легко проверить строковое поле с помощью следующего правила: принимать пустые строки или строки длиной от 5 до 10 символов.

`validate:empty=true | gte=5 & lte=10`

В пакете go-plays / validator это может быть достигнуто с помощью omitempty валидатора, что не очень интуитивно понятно.

omitempty,gte=5,lte=10

Уточнены имена валидаторов

В пакете dealancer / validate format=number валидатор проверяет, является ли строка числом, поэтому -1.1 проверяет правильно. Однако в пакете go-plays / validator number отличается: он проверяет, что все символы строки являются цифрами, поэтому -1.1 проверка не выполняется.

Также в пакете dealancer / validate нет валидаторов amigos или псевдонимов. Я старался свести количество валидаторов к минимуму.

Проверка массива / среза / карты структур

Пакет dealancer / validate предоставляет Validate метод, рекурсивно работающий с любой структурой данных. Например, вы можете запустить проверку массива структур, и она будет работать.

err := validate.Validate([3]S{s1, s2, s3});`

Я не думаю, что это возможно сделать с помощью пакета go-plays / validator.

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

Пакет dealancer / validate позволяет вам определить Validate метод для типа для выполнения пользовательской проверки.

// Custom validation
func (s S) Validate() error {
    if !StrongPassword(s.Field) {
        return errors.New("Password should be strong!")
    }
    return nil
}

Дела, которые необходимо сделать

Dealancer / validate - проект достаточно новый, хотя он уже покрыт 100% тестов, текущая версия - v2, и я планирую работать над v3 в ближайшее время. Эта новая версия предоставит:

  • () круглые скобки, позволяющие группировать логические операторы И / ИЛИ
  • Лучшая обработка ошибок (например, настраиваемый текст, локализация, поддержка веб-форм и т. Д.)
  • Поддержка экранированных символов, позволяющая вводить зарезервированные символы

Попробуйте!

go get gopkg.in/dealancer/validate.v2