Как проверить фрагмент строки - PullRequest
0 голосов
/ 28 апреля 2018

Я использовал пакет "gopkg.in/go-playground/validator.v9", и я прочитал это doc . Я хочу проверить на фрагмент строки.

Есть несколько моментов: 1 - переменная должна быть срезом

2 - Макс. Длина 10

3 - Срез не должен быть нулевым

4 - элемент среза является строкой

5 - максимальная длина каждого элемента 12

Это код:

var validate *validator.Validate

func main() {
    validate = validator.New()
    validateVariable()
}

func validateVariable() {
mySlice := []string{"111","222"}
errs := validate.Var(mySlice , "required,max=10,min=1")
if errs != nil {
    fmt.Println(errs) 
    return
}

1 Ответ

0 голосов
/ 28 апреля 2018

Пакет "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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...