Iは、以下の構造を検証したい:種類= A場合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"` }
を私が存在している必要があり、その後、種類に応じてAとBを検証したい うと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の値のトレースを保つために、すべての「検証」フィールドを反復処理しなければならないが、AとB、その後、種類に応じて、それらをチェックする...
私はこのでした
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()
}