Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 如何获取空接口的动态类型_Validation_Go_Go Gin - Fatal编程技术网

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

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"`

我尝试在go-gin框架中测试请求数据的验证,到目前为止,我得到了这段工作正常的代码

// 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++中的指针相同。不同的是接口值。