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

我正在尝试为杜松子酒创建自己的验证器,但我希望它是“通用的”,所以比方说,我想要一个接口 IsValid


type IsValid interface {

    IsValid() bool

}

,并使一些结构在实现该接口的某些字段中具有绑定:“IsValid”。


但我不知道如何编写我的自定义验证器来获取该字段,将其转换为 IsValid 接口,然后执行 isValid 方法。


我正在使用 go-playground 验证程序包: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()

    })

}


慕姐8265434
浏览 86回答 1
1回答

翻过高山走不出你

该FieldLevel类型具有此方法:// returns current field for validationField() reflect.Valuereflect.Value有这个方法:func (v Value) Interface() (i any)接口将 v 的当前值作为接口{}返回。它相当于:var i interface{} = (v's underlying value)如果 Value 是通过访问未导出的结构字段获得的,它会发生恐慌。您可以使用类型断言将interface{}/any值用作更具体的接口,如下所示:var i interface{} = somethingvar x = i.(MyInterface)如果该值i未实现,这将引起恐慌MyInterface。要检查这种情况,可以使用替代形式:var x, ok = i.(MyInterface)if ok {    // use x} else {    // type conversion failed}将它们放在一起,您的代码将是这样的:isValidField, ok := fl.Field().Interface().(IsValid)
打开App,查看更多内容
随时随地看视频慕课网APP