not validator.ValidationErrors (types from different packages)

konakona
  • 65

完成错误:
interface conversion: error is validator.ValidationErrors, not validator.ValidationErrors (types from different packages)

诉求:
写了一个简单的Go gin项目,只有一个功能,所以不会太复杂。写到最后打算封装下基础的部分,于是欲封装下验证这一块。

代码如下:

// Bind : bind request dto and auto verify parameters
func Bind(c *gin.Context, obj interface{}) error {
    _ = c.ShouldBindUri(obj)
    if err := c.ShouldBind(obj); err != nil {
        util.Log.Notice(reflect.TypeOf(err))
        util.Log.Notice(err.(validator.ValidationErrors))
        if fieldErr, ok := err.(validator.ValidationErrors); ok {
            var tagErrorMsg []string
            for _, v := range fieldErr {
                if _, has := ValidateErrorMessage[v.Tag]; has {
                    tagErrorMsg = append(tagErrorMsg, fmt.Sprintf(ValidateErrorMessage[v.Tag], v.Field, v.Value))
                } else {
                    tagErrorMsg = append(tagErrorMsg, err.Error())
                }
            }
            return errors.New(strings.Join(tagErrorMsg, ","))
        }
    }
    return nil
}

引入文件如下:

import (
    "FoodBackend/pkg/util"
    "reflect"
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/pkg/errors"
    "gopkg.in/go-playground/validator.v8"
    "strings"
)

会在这样使用err.(validator.ValidationErrors)时报错。
err的类型也是validator.ValidationErrors

整个项目仅一处使用了这个包,且确定没有其他验证类的包在项目其他文件有引入。
image.png

回复
阅读 1.8k
1 个回答

这个问题我花了点时间找到了根源,见下图。
image.png

早期go-gin使用的go-playground/validator包地址是gopkg.in/go-playground,网上留了大量的资料(随便举几个例:ABC),而现在go-gin使用的是v10,依赖的包地址github.com/go-playground/validator,不是gopkg.in/go-playground/validator.v10,这就造成了这次遇到的问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏