我正在尝试为gin创建自己的验证器,但我希望它是“通用的”,因此,假设我想拥有一个接口IsValid
type IsValid interface {
IsValid() bool
},并在实现该接口的某些字段中创建一些具有binding:"IsValid“的结构。
但是,我不知道如何编写我的自定义验证器来获取字段,将其转换到IsValid接口,然后执行isValid方法。
我使用的是游乐园验证程序包:https://github.com/go-playground/validator。
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// registering validation for isValid
v.RegisterValidation("isValid", func(fl validator.FieldLevel) bool {
isValidField := // TODO do something to cast it to that interface
return isValidField.IsValid()
})
}发布于 2022-07-11 11:55:54
FieldLevel类型具有以下方法:
// returns current field for validation
Field() reflect.Valuefunc (v Value) Interface() (i any)接口作为接口{}返回v的当前值。它相当于:
var i interface{} = (v's underlying value)如果该值是通过访问未导出的struct字段获得的,则会引起恐慌。
您可以使用类型断言将interface{} / any值用作更具体的接口,如下所示:
var i interface{} = something
var x = i.(MyInterface)如果值i没有实现MyInterface,这将引起恐慌。要检查这种情况,可以使用替代形式:
var x, ok = i.(MyInterface)
if ok {
// use x
} else {
// type conversion failed
}将其组合在一起,您的代码将如下所示:
isValidField, ok := fl.Field().Interface().(IsValid)https://stackoverflow.com/questions/72935418
复制相似问题