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

如何获取空接口的动态类型

如何获取空接口的动态类型

Go
慕村225694 2022-07-18 16:17:36
到目前为止,我尝试在 go-gin 框架中测试请求数据的验证,我得到了可以正常工作的代码。// RegisterEmailPasswordValidator it is used for validation and json marshallingtype RegisterEmailPasswordValidator struct {    Email    string `json:"email" binding:"required,email"`    Password string `json:"password" binding:"required,gte=6,lte=30"`}// Validate used in viewsfunc (v *RegisterEmailPasswordValidator) Validate( c *gin.Context) error {    if err := c.ShouldBindJSON(v); err != nil {        return err    }    return nil}// use it like this in my controllervar validator validations.RegisterEmailPasswordValidatorerr := validator.Validate(c)为了干,我尝试添加一个全局函数来验证所有结构的责任。我尝试添加一个具有空界面的函数,如下所示。// Validate used in viewsfunc Validate(c *gin.Context, customValidator interface{}) error {       if err := c.ShouldBindJSON(&customValidator); err != nil {        return err    }    return nil}// use it like this in my controllervar validator validations.RegisterEmailPasswordValidatorerr := validations.Validate(c, &validator)但是当我将 customValidator 发送到 ShouldBindJSON 时它不起作用它使用空接口而不是动态类型。有没有办法使用动态类型的 customValidator 而不提及它的类型?我试过反映。在这种情况下,有没有更好的方法来干燥?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

您应该按原样传递接口,而不是指向接口的指针。像这样的东西:


// Validate used in views

func Validate(c *gin.Context, customValidator interface{}) error {   

    if err := c.ShouldBindJSON(customValidator); err != nil {

        return err

    }

    return nil

}


// use it like this in my controller

var validator validations.RegisterEmailPasswordValidator

err := validations.Validate(c, &validator)

原因是 Go 中的指针与 C/C++ 中的指针不同,它们保留类型和值引用。指向接口的指针不是指向它所持有的类型的指针,而是指向接口本身的指针,类型是接口。在ShouldBindJSON函数中尝试通过反射获取对象,但它获取的是接口类型和引用,而不是validators 引用,因此它无法完成它的工作,因为它需要一个类型,而不是一个接口。


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

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