Я хотел бы проверить следующую структуру:Golang валидатор многопрофильное зависимость
type CarModel struct { gorm.Model OwnerID int `json:"ownerid" validate:"nonzero"` Type string `json:"type" validate:"regexp=(?)(A|B)"` A string `json:"url" validate:"isurl"` B string `json:"ip" validate:"isip"` }
Я хотел бы подтвердить А и В в зависимости от типа, если тип = А, то А должен существовать и должен быть URL, НО B не должно существовать , если тип = B, тогда A не должно существовать, а B должен быть IP
это возможно с помощью валидатора?
Я попытался пользовательскую проверку, но я не могу найти способ, чтобы увидеть значение типа:
func checkB(v interface{}, param string) error {
theB := reflect.ValueOf(v)
if theB.Kind() != reflect.String {
return validator.ErrUnsupported
}
//check if B is an IP
ipcool := net.ParseIP(theB.String())
if ipcool == nil {
return errors.New("B : ip incorrecte " + theB.String())
}
return nil
}
После ответа Алекс Никол, я хотел бы прежде всего поблагодарить вас за вашу помощь.
Если я правильно понял, я бы перебрать все поля «Подтвердить», чтобы сохранить след значения TYPE, А и В, а затем проверить их в зависимости от типа ...
Я сделал это:
func checkMonitor(v interface{}) error {
var mytype string
var myA string
var myB string
val := reflect.ValueOf(v)
// Iterate through fields
for i := 0; i < val.NumField(); i++ {
// Lookup the validate tag
field := val.Type().Field(i)
tags := field.Tag
_, ok := tags.Lookup("validate")
if !ok {
// No validate tag.
continue
}
// Get the value of the field.
fieldValue := val.Field(i)
switch field.Name {
case "Type":
mytype = fieldValue.Interface()
case "A":
myA = fieldValue.Interface()
case "B":
myB = fieldValue.Interface()
}
// Validation logic here.
//fmt.Println("field", field.Name, "has validate tag", validate, "and value", fieldValue.Interface())
}
if mytype == "A" {
if myA == "" {
return errors.New("A vide et type A")
}
ipcool := net.ParseIP(myA)
if ipcool == nil {
return errors.New("A incorrecte " + myA)
}
} else if mytype == "HTML" {
if myB == "" {
return errors.New("B vide et type B")
}
_, urlpascool := url.ParseRequestURI(myB)
if urlpascool != nil {
return errors.New("B incorrecte " + myB)
}
}
return nil
}
но получил ошибку на MyType, Mya и Myb в случае переключения:
не может использовать fieldValue.Interface() (тип интерфейса {}) как тип строки в назначении: требуется тип утверждения
EDIT: просто нужно использовать мой мозг:
switch field.Name {
case "Type":
mytype = fieldValue.String()
case "A":
myA = fieldValue.String()
case "B":
myB = fieldValue.Interface()
}