Validation 如何获取空接口的动态类型
我尝试在go-gin框架中测试请求数据的验证,到目前为止,我得到了这段工作正常的代码Validation 如何获取空接口的动态类型,validation,go,go-gin,Validation,Go,Go Gin,我尝试在go-gin框架中测试请求数据的验证,到目前为止,我得到了这段工作正常的代码 // RegisterEmailPasswordValidator it is used for validation and json marshalling type RegisterEmailPasswordValidator struct { Email string `json:"email" binding:"required,email"`
// RegisterEmailPasswordValidator it is used for validation and json marshalling
type RegisterEmailPasswordValidator struct {
Email string `json:"email" binding:"required,email"`
Password string `json:"password" binding:"required,gte=6,lte=30"`
}
// Validate used in views
func (v *RegisterEmailPasswordValidator) Validate( c *gin.Context) error {
if err := c.ShouldBindJSON(v); err != nil {
return err
}
return nil
}
// use it like this in my controller
var validator validations.RegisterEmailPasswordValidator
err := validator.Validate(c)
简单地说,我尝试添加一个全局函数来验证所有结构的责任。我试图添加一个带有空接口的函数,如bellow
// 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)
但当我将customValidator发送到ShouldBindJSON时,它不起作用。它使用空接口,而不是动态类型
有没有办法使用customValidator的动态类型而不提及它的类型?我试着思考。在这种情况下,在go中有更好的干燥方法吗?您应该按原样传递接口,而不是指向接口的指针。大概是这样的:
// 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
中,函数试图通过反射获取对象,但它获取的是接口类型和引用,而不是validator
s引用,因此它无法完成其工作,因为它需要类型,而不是接口。@iloverreflection我尝试了您的建议,出现了一个错误json:Unmarshal(非指针验证。RegisterEmailPassword)我误解了代码。我不知道验证函数在哪里使用。忽略我之前的评论。你不应该将指向接口的指针发送到你的函数。另外,我猜ShouldBindJson的输入是一个接口,而你已经有了一个接口,为什么要将指针传递到该接口?@Mastisa接受的答案正是我建议的。也就是说,问题中的代码没有使用Validate函数,所以我仍然感到困惑。我不记得你的建议,但你的建议有我提到的错误。Go中的指针与C/C++中的指针相同。不同的是接口值。