亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取空接口的動態類型

如何獲取空接口的動態類型

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 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號