首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang创建执行接口方法的自定义验证器

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

Stack Overflow用户
提问于 2022-07-11 08:03:20
回答 1查看 315关注 0票数 -1

我正在尝试为gin创建自己的验证器,但我希望它是“通用的”,因此,假设我想拥有一个接口IsValid

代码语言:javascript
复制
type IsValid interface {
    IsValid() bool
}

,并在实现该接口的某些字段中创建一些具有binding:"IsValid“的结构。

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

我使用的是游乐园验证程序包:https://github.com/go-playground/validator

代码语言:javascript
复制
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()
    })
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-11 11:55:54

FieldLevel类型具有以下方法:

代码语言:javascript
复制
// returns current field for validation
Field() reflect.Value

reflect.Value这种方法

代码语言:javascript
复制
func (v Value) Interface() (i any)

接口作为接口{}返回v的当前值。它相当于: var i interface{} = (v's underlying value) 如果该值是通过访问未导出的struct字段获得的,则会引起恐慌。

您可以使用类型断言interface{} / any值用作更具体的接口,如下所示:

代码语言:javascript
复制
var i interface{} = something
var x = i.(MyInterface)

如果值i没有实现MyInterface,这将引起恐慌。要检查这种情况,可以使用替代形式:

代码语言:javascript
复制
var x, ok = i.(MyInterface)
if ok {
    // use x
} else {
    // type conversion failed
}

将其组合在一起,您的代码将如下所示:

代码语言:javascript
复制
isValidField, ok := fl.Field().Interface().(IsValid)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72935418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档