Загрузка пакета: перейдите на github.com/go-playground/validator/v10
демонстрационный пример:GitHub.com/jambo-git/V…
I. Обзор
Проблема, часто встречающаяся при разработке интерфейса, заключается в том, что серверной части необходимо написать много громоздкого кода для проверки данных, поэтому мне интересно, существует ли правило для проверки, аналогичной проверке внешнего интерфейса, и затем я нашел пакет валидатора. , сравнение Мощный набор инструментов для проверки Ниже приведены некоторые краткие сведения об обучении, подробности можно просмотретьvalidator
Во-вторых, описание оператора
отметка | описание тега |
---|---|
, | Разделение нескольких операторов |
| | Или операция |
- | пропустить проверку поля |
3. Описание общих знаков
отметка | описание тега | пример |
---|---|---|
required | необходимые | Поле или структураvalidate:"required"
|
omitempty | Игнорировать, когда пусто | Поле или структураvalidate:"omitempty"
|
len | длина | Field validate:"len=0"
|
eq | равный | Field validate:"eq=0"
|
gt | больше, чем | Field validate:"gt=0"
|
gte | больше или равно | Field validate:"gte=0"
|
lt | меньше, чем | Field validate:"lt=0"
|
lte | Меньше или равно | Field validate:"lte=0"
|
eqfield | Поля одной структуры равны | Field validate:"eqfield=Field2"
|
nefield | Поля одной структуры не равны | Field validate:"nefield=Field2"
|
gtfield | больше, чем одно и то же поле структуры | Field validate:"gtfield=Field2"
|
gtefield | Больше или равно тому же полю структуры | Field validate:"gtefield=Field2"
|
ltfield | меньше, чем такое же поле структуры | Field validate:"ltfield=Field2"
|
ltefield | Меньше или равно тому же полю структуры | Field validate:"ltefield=Field2"
|
eqcsfield | Равенство между различными полями структуры | Struct1.Field validate:"eqcsfield=Struct2.Field2"
|
necsfield | Не одинаково в разных полях структуры | Struct1.Field validate:"necsfield=Struct2.Field2"
|
gtcsfield | Больше, чем пересечение различных структурных полей | Struct1.Field validate:"gtcsfield=Struct2.Field2"
|
gtecsfield | Больше или равно в разных полях структуры | Struct1.Field validate:"gtecsfield=Struct2.Field2"
|
ltcsfield | меньше, чем в разных полях структуры | Struct1.Field validate:"ltcsfield=Struct2.Field2"
|
ltecsfield | Меньше или равно в разных полях структуры | Struct1.Field validate:"ltecsfield=Struct2.Field2"
|
min | Минимум | Field validate:"min=1"
|
max | максимальное значение | Field validate:"max=2"
|
structonly | Проверяет только структуру, а не поля структуры | Struct validate:"structonly"
|
nostructlevel | Не запускайте проверку на структурном уровне | Struct validate:"nostructlevel"
|
dive | Проверка расширения вниз, многоуровневое погружение требует нескольких маркеров погружения | [][]string validate:"gt=0,dive,len=1,dive,required"
|
dive Keys & EndKeys | Используется вместе с погружением, он используется для проверки ключа и значения объекта карты, ключи - ключ, и endkeys - это значение | map[string]string validate:"gt=0,dive,keys,eq=1|eq=2,endkeys,required"
|
required_with | Одно из других полей не пусто, и текущее поле не пусто. | Field validate:"required_with=Field1 Field2"
|
required_with_all | Все остальные поля не пусты, а текущее поле не пусто | Field validate:"required_with_all=Field1 Field2"
|
required_without | Одно из других полей пусто, и текущее поле не пусто | Field `validate:"required_without=Field1 Field2" |
required_without_all | Все остальные поля пусты, и текущее поле не пусто. | Field validate:"required_without_all=Field1 Field2"
|
isdefault | это значение по умолчанию | Field validate:"isdefault=0"
|
oneof | один из них | Field validate:"oneof=5 7 9"
|
containsfield | поле содержит другое поле | Field validate:"containsfield=Field2"
|
excludesfield | Поле не содержит другого поля | Field validate:"excludesfield=Field2"
|
unique | Это уникально, обычно используется для ломтиков или структур | Field validate:"unique"
|
alphanum | Содержит ли строковое значение только буквенно-цифровые символы ASCII. | Field validate:"alphanum"
|
alphaunicode | содержит ли строковое значение только символы Юникода | Field validate:"alphaunicode"
|
alphanumunicode | Содержит ли строковое значение только буквенно-цифровые символы Юникода. | Field validate:"alphanumunicode"
|
numeric | Содержит ли строковое значение базовые числовые значения. | Field validate:"numeric"
|
hexadecimal | Строковое значение содержит допустимое шестнадцатеричное число. | Field validate:"hexadecimal"
|
hexcolor | Содержит ли строковое значение допустимый шестнадцатеричный цвет | Field validate:"hexcolor"
|
lowercase | Содержит ли строковое значение только строчные буквы | Field validate:"lowercase"
|
uppercase | содержит ли строковое значение только символы верхнего регистра | Field validate:"uppercase"
|
Строковое значение содержит действительный адрес электронной почты | Field validate:"email"
|
|
json | Является ли строковое значение допустимым JSON | Field validate:"json"
|
file | Содержит ли строковое значение, содержит действительный путь к файлу, и существует ли файл на компьютере | Field validate:"file"
|
url | содержит ли строковое значение допустимый URL-адрес | Field validate:"url"
|
uri | содержит ли строковое значение, содержит действительный URI | Field validate:"uri"
|
base64 | Содержит ли строковое значение допустимое значение base64. | Field validate:"base64"
|
contains | Строковое значение содержит значение подстроки | Field validate:"contains=@"
|
containsany | Строковое значение содержит любой символ в значении подстроки | Field validate:"containsany=abc"
|
containsrune | Строковое значение содержит предоставленное значение специального символа | Field validate:"containsrune=☢"
|
excludes | Строковое значение не содержит значения подстроки | Field validate:"excludes=@"
|
excludesall | Строковое значение не содержит значения подстроки | Field validate:"excludesall=abc"
|
excludesrune | Строковое значение не включает предоставленное значение специального символа | Field validate:"containsrune=☢"
|
startswith | Строка начинается с предоставленного строкового значения | Field validate:"startswith=abc"
|
endswith | Строка заканчивается предоставленным строковым значением | Field validate:"endswith=abc"
|
ip | Строковое значение содержит действительный IP-адрес | Field validate:"ip"
|
ipv4 | содержит ли строковое значение действительный адрес ipv4 | Field validate:"ipv4"
|
datetime | Содержит ли строковое значение допустимую дату | Field validate:"datetime"
|
4. Примечания по использованию знаков
1. Когда условия поиска конфликтуют со специальными тегами, такими как: запятая (,) или операция (|), тире (-) и т. д., необходимо использовать шестнадцатеричное представление UTF-8.
пример:
type Test struct {
Field1 string `validate:"excludesall=|"` // 错误
Field2 string `validate:"excludesall=0x7C"` // 正确.
}
2. Вы можете получить объект ошибки через validationErrors := errs.(validator.ValidationErrors), чтобы настроить ошибку ответа. 3. Пользовательский перевод результатов проверки
// 初始化翻译器
func validateInit() {
zh_ch := zh.New()
uni := ut.New(zh_ch) // 万能翻译器,保存所有的语言环境和翻译数据
Trans, _ = uni.GetTranslator("zh") // 翻译器
Validate = validator.New()
_ = zh_translations.RegisterDefaultTranslations(Validate, Trans)
// 添加额外翻译
_ = Validate.RegisterTranslation("required_without", Trans, func(ut ut.Translator) error {
return ut.Add("required_without", "{0} 为必填字段!", true)
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("required_without", fe.Field())
return t
})
}
5. Пример использования
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
// 实例化验证对象
var validate = validator.New()
func main() {
// 结构体验证
type Inner struct {
String string `validate:"contains=111"`
}
inner := &Inner{String: "11@"}
errs := validate.Struct(inner)
if errs != nil {
fmt.Println(errs.Error())
}
// 变量验证
m := map[string]string{"": "", "val3": "val3"}
errs = validate.Var(m, "required,dive,keys,required,endkeys,required")
if errs != nil {
fmt.Println(errs.Error())
}
}