亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用自定義驗證器驗證結構數據類型?

如何使用自定義驗證器驗證結構數據類型?

Go
慕姐8265434 2022-08-24 20:09:44
我正在使用來驗證一些輸入,并且在自定義驗證標記和函數方面遇到了一些問題。問題是,當其中一個結構字段是另一個結構時,不會調用該函數。下面是一個示例:go-playground/validator/v10type ChildStruct struct {    Value int}type ParentStruct struct {    Child ChildStruct `validate:"myValidate"`}func myValidate(fl validator.FieldLevel) bool {    fmt.Println("INSIDE MY VALIDATOR") // <- This is never printed    return false}func main() {    validator := validator.New()    validator.RegisterValidation("myValidate", myValidate)    data := &ParentStruct{        Child: ChildStruct{            Value: 10,        },    }    validateErr := validator.Struct(data)    if validateErr != nil { // <- This is always nil since MyValidate is never called        fmt.Println("GOT ERROR")        fmt.Println(validateErr)    }    fmt.Println("DONE")}如果我將父結構更改為:type ParentStruct struct {    Child int `validate:"myValidate"`}一切都很好。但是,如果我將部件添加到 ChildStruct 中,它也可以正常工作,則返回的錯誤是說 ChildStruct.Value 是錯誤的,而它應該說 ParentStruct.Child 是錯誤的。validate:"myValidate"有人知道我做錯了什么嗎?
查看完整描述

2 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

搜索了一段時間后,我終于找到了一個名為的函數,該函數注冊了一個自定義類型,這將使驗證它成為可能。因此,解決方案是將以下內容添加到問題中的示例中:RegisterCustomTypeFuncgo-playground/validator/v10


func childStructCustomTypeFunc(field reflect.Value) interface{} {   

    if value, ok := field.Interface().(ChildStruct); ok {

        return value.Value

    }

    return nil

}

?:


validator.RegisterCustomTypeFunc(childStructCustomTypeFunc, ChildStruct{})

現在驗證器將進入函數,并且返回消息將是字段的錯誤myValidateParentStruct.Child


查看完整回答
反對 回復 2022-08-24
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

該函數正在注冊字段級別的自定義驗證程序,如已注冊函數的類型所示。validator.RegisterValidation(...)func(fl validator.FieldLevel) bool


結構字段本身不會以這種方式進行驗證,并且您的自定義驗證程序將被忽略。


要驗證結構字段,應使用 ,其中函數的類型為 。validate.RegisterStructValidation(myValidate, ChildStruct{})myValidatevalidator.StructLevelFunc


在此函數中,您可以對結構、字段本身和/或其嵌套字段執行驗證:


func myValidate(sl validator.StructLevel) {

    fmt.Println("INSIDE MY VALIDATOR") // now called

    if sl.Current().Interface().(ChildStruct).Value != 20 {

        sl.ReportError(sl.Current().Interface(), "ChildStruct", "", "", "")

    }

}


func main() {

    vald := validator.New()

    vald.RegisterStructValidation(myValidate, ChildStruct{})

    data := &ParentStruct{

        Child: ChildStruct{

            Value: 10,

        },

    }

    validateErr := vald.Struct(data)

    if validateErr != nil {         

        fmt.Println("GOT ERROR")

        fmt.Println(validateErr)

    }

    fmt.Println("DONE")

}

操場上的例子:https://play.golang.org/p/f0f2YE_e1VL


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號