为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 创建执行接口方法的自定义验证器

Golang 创建执行接口方法的自定义验证器

Go
慕姐8265434 2023-01-03 13:59:29
我正在尝试为杜松子酒创建自己的验证器,但我希望它是“通用的”,所以比方说,我想要一个接口 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)


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信