Go использует валидатор для проверки внутренних данных

Go

Загрузка пакета: перейдите на 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"
email Строковое значение содержит действительный адрес электронной почты 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())
   }
}