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

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

在 Golang 中使用 OR 條件驗證結構的兩個字段

在 Golang 中使用 OR 條件驗證結構的兩個字段

Go
慕哥9229398 2022-12-13 16:25:24
我正在嘗試驗證具有兩個字段的結構,其中一個是必需的,另一個不是。這是結構:type man struct {    // required: true    Numbers []int `json:"numbers"`    // required: false    Pass bool `json:"pass"`}為了驗證我正在使用這個包:https://pkg.go.dev/gopkg.in/validator.v2我的目標是創造以下條件:數字為非零或通過為真。但是,如果我將數字定義為非零值,它將阻止對 Pass 字段的檢查。我嘗試創建一個自定義的驗證器函數,但由于其中一個字段不是必需的,我不確定如何構建此條件。謝謝!
查看完整描述

2 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

對于較新版本的驗證程序包(例如,v9以后的版本),您可以使用required_without標簽。


僅當任何其他指定字段不存在時,驗證字段必須存在且不為空。對于字符串,確保值不是“”。對于切片、映射、指針、接口、通道和函數,確保值不為零。


type man struct {

    Numbers []int  `json:"numbers" validate:"required_without=Pass"`

    Pass    bool   `json:"pass"`

}

使用不同的輸入進行測試:


man{}

man{nil, false}

man{nil, true}

man{[]int{}, false}

給出:


Key: 'man.Numbers' Error:Field validation for 'Numbers' failed on the 'required_without' tag

Key: 'man.Numbers' Error:Field validation for 'Numbers' failed on the 'required_without' tag

pass

pass

不幸的是,v2您只能實現單個字段驗證,因此您實際上沒有一種很好且直接的方法來訪問父結構。您可能必須將該結構包裝在另一個結構中才能將其視為man一個字段。


type wrapper struct {

    man man `validate:"man"`

}


// Very simple validation func

func manValidator(v interface{}, param string) error {

    m := v.(man)

    if m.Numbers != nil || m.Pass {

        return nil

    }

    return errors.New("validation failed")

}


func main() {

    validate.SetValidationFunc("man", manValidator)

    validator.Validate(wrapper{man{}})

}


查看完整回答
反對 回復 2022-12-13
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

type Man struct {

    // required: true

    Numbers []int `json:"numbers" cond1:"nonnil"`

    // required: false

    Pass bool `json:"pass" cond2:"nonzero"`

}


func main() {

    // .... 

    cond1Validator := validator.NewValidator()

    cond1Validator.SetTag("cond1")

    cond2Validator := validator.NewValidator()

    cond2Validator.SetTag("cond2")

    if errs := cond1Validator.Validate(man); errs != nil {

        if errs := cond2Validator.Validate(man); errs != nil {

            log.Fatalln(errs)

        }

    }

    // ....

}

您可以嘗試自定義標簽名稱和多個 vaidators..


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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