【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の値を比較 }