学習備忘ログ

よく使うコードや設定のメモ

【Golang + go-playground/validator】他のフィールドの値を含めたカスタムバリデーションの実装

課題

  • 他のフィールドの値を含めたカスタムバリデーションの実装をしたい

サンプル実装

AフィールドとBフィールドの値を比較してバリデーションする方法。こちらはそもそもカスタムせずに gtecsfieldを使用すれば実現できる。

type SampleStruct struct {
    A          int    `form:"a" json:"a" validate:"greater=B"` //Aの値がBより大きいかのバリデートを指定
    B          int    `form:"b" json:"b" validate:"required"`
}

func (cv *CustomValidator) Validate(i interface{}) error {
    cv.validator.RegisterValidation("greater", CustomValidate) //greaterという名前のバリデートを登録
    return cv.validator.Struct(i)
}

func CustomValidate(fl validator.FieldLevel) bool {
    param := fl.Param() // Bが返却される。 greater=X の Xが返却されるので。
    paramFieldValue := fl.Parent().FieldByName(param) //フィールドBの値を取得。

    return fl.Field().Int() > paramFieldValue.Int() //Aの値とBの値を比較
}