Лучшая проверка структуры в 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