第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何使用自定義驗(yàn)證器驗(yàn)證結(jié)構(gòu)數(shù)據(jù)類型?

如何使用自定義驗(yàn)證器驗(yàn)證結(jié)構(gòu)數(shù)據(jù)類型?

Go
慕姐8265434 2022-08-24 20:09:44
我正在使用來驗(yàn)證一些輸入,并且在自定義驗(yàn)證標(biāo)記和函數(shù)方面遇到了一些問題。問題是,當(dāng)其中一個(gè)結(jié)構(gòu)字段是另一個(gè)結(jié)構(gòu)時(shí),不會調(diào)用該函數(shù)。下面是一個(gè)示例: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")}如果我將父結(jié)構(gòu)更改為:type ParentStruct struct {    Child int `validate:"myValidate"`}一切都很好。但是,如果我將部件添加到 ChildStruct 中,它也可以正常工作,則返回的錯誤是說 ChildStruct.Value 是錯誤的,而它應(yīng)該說 ParentStruct.Child 是錯誤的。validate:"myValidate"有人知道我做錯了什么嗎?
查看完整描述

2 回答

?
30秒到達(dá)戰(zhàn)場

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

搜索了一段時(shí)間后,我終于找到了一個(gè)名為的函數(shù),該函數(shù)注冊了一個(gè)自定義類型,這將使驗(yàn)證它成為可能。因此,解決方案是將以下內(nèi)容添加到問題中的示例中: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{})

現(xiàn)在驗(yàn)證器將進(jìn)入函數(shù),并且返回消息將是字段的錯誤myValidateParentStruct.Child


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

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊

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


結(jié)構(gòu)字段本身不會以這種方式進(jìn)行驗(yàn)證,并且您的自定義驗(yàn)證程序?qū)⒈缓雎浴?/p>


要驗(yàn)證結(jié)構(gòu)字段,應(yīng)使用 ,其中函數(shù)的類型為 。validate.RegisterStructValidation(myValidate, ChildStruct{})myValidatevalidator.StructLevelFunc


在此函數(shù)中,您可以對結(jié)構(gòu)、字段本身和/或其嵌套字段執(zhí)行驗(yàn)證:


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


查看完整回答
反對 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 136 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號