我正在尝试为杜松子酒创建自己的验证器,但我希望它是“通用的”,所以比方说,我想要一个接口 IsValidtype IsValid interface { IsValid() bool},并使一些结构在实现该接口的某些字段中具有绑定:“IsValid”。但我不知道如何编写我的自定义验证器来获取该字段,将其转换为 IsValid 接口,然后执行 isValid 方法。我正在使用 go-playground 验证程序包:https ://github.com/go-playground/validatorif 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() })}
1 回答
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
该FieldLevel类型具有此方法:
// returns current field for validation
Field() reflect.Value
reflect.Value有这个方法:
func (v Value) Interface() (i any)
接口将 v 的当前值作为接口{}返回。它相当于:
var i interface{} = (v's underlying value)
如果 Value 是通过访问未导出的结构字段获得的,它会发生恐慌。
您可以使用类型断言将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)
- 1 回答
- 0 关注
- 104 浏览
添加回答
举报
0/150
提交
取消