Пакет "gopkg.in/go-playground/validator.v9" предназначен для структур и переменных, смотрите:
Валидатор пакетов реализует валидацию значений для структур и
отдельные поля на основе тегов.
Он также может обрабатывать перекрестные и перекрестные проверки для вложенных
структурирует и может погружаться в массивы и карты любого типа.
Так что вы можете попробовать это:
func validateVariable() {
mySlice := []string{"111", "222"}
//1 (to convert in error)
println(reflect.TypeOf(mySlice).Kind() == reflect.Slice)
//2,3,5
errs := validate.Var(mySlice, "required,max=10,min=1,dive,max=12")
if errs != nil {
fmt.Println(errs)
return
}
//4 (to convert in error)
println(reflect.TypeOf(mySlice).Elem().Kind() == reflect.String)
}
С более подробной информацией:
func validateVariable() {
mySlice := []string{"111", "222"}
//mySlice := []string{"111", "222", "", "", "", "", "", "", "", "", "", "", ""}
//mySlice := []string{"111", "222000000000000", "0000000000000"}
//1
if reflect.TypeOf(mySlice).Kind() != reflect.Slice {
fmt.Println("Invalid in: Variable must be slice")
}
//2
errs2 := validate.Var(mySlice, "max=10")
if errs2 != nil {
fmt.Println("Invalid in: Max len is 10. Original: ")
fmt.Println(errs2)
return
}
//3
errs3 := validate.Var(mySlice, "required")
if errs3 != nil {
fmt.Println("Invalid in: Slice should not be null. Original: ")
fmt.Println(errs3)
return
}
//4
if reflect.TypeOf(mySlice).Elem().Kind() != reflect.String {
fmt.Println("Invalid in: Element slice are string")
return
}
//5
errs5 := validate.Var(mySlice, "dive,max=12") //applied in elements
if errs5 != nil {
fmt.Println("Invalid in: Max length of every element is 12. Original: ")
fmt.Println(errs5)
return
}
}
Другим способом является проверка пользовательских функций. В моем тесте я создал функции:
//IsSlice check if field kind is equal to slice
func IsSlice(fl validator.FieldLevel) bool {
if fl.Top().Kind() == reflect.Slice {
return true
}
return false
}
//IsSlice check if field element kind is equal to string
func IsStringElem(fl validator.FieldLevel) bool {
t := fl.Top().Type()
if t.Elem().Kind() == reflect.String {
return true
}
return false
}
Реестр этих функций:
func main() {
validate = validator.New()
validate.RegisterValidation("isslice", IsSlice)
validate.RegisterValidation("isstringelem", IsStringElem)
validateVariable()
}
Результат получился более элегантным (подробно):
func validateVariable() {
mySlice := []string{"111", "222"}
//mySlice := []string{"111", "222", "", "", "", "", "", "", "", "", "", "", ""}
//mySlice := []string{"111", "222000000000000", "0000000000000"}
//1 - using tag custimized
errs1 := validate.Var(mySlice, "isslice")
if errs1 != nil {
fmt.Println("Invalid in: Variable must be slice")
fmt.Println(errs1)
return
}
//2
errs2 := validate.Var(mySlice, "max=10")
if errs2 != nil {
fmt.Println("Invalid in: Max len is 10. Original: ")
fmt.Println(errs2)
return
}
//3
errs3 := validate.Var(mySlice, "required")
if errs3 != nil {
fmt.Println("Invalid in: Slice should not be null. Original: ")
fmt.Println(errs3)
return
}
//4 - using tag customized
errs4 := validate.Var(mySlice, "isstringelem")
if errs4 != nil {
fmt.Println("Invalid in: Element slice are string")
fmt.Println(errs4)
return
}
//5
errs5 := validate.Var(mySlice, "dive,max=12") //applied in elements
if errs5 != nil {
fmt.Println("Invalid in: Max length of every element is 12. Original: ")
fmt.Println(errs5)
return
}
}