小编典典

如果包装对象,将Golang强制转换为自定义类型会失败

go

在我的应用中,我用于validator.v9验证模型。验证后,我可以强制转换error界面并成功,在控制台上看到“确定”

err := v.ModelValidator.Struct(model)

if _, ok := err.(validator.ValidationErrors); ok {
    fmt.Println("ValidateModel: OK")
} else{
    fmt.Println("ValidateModel: FALSE")
}

我需要将此对象包装到另一个对象中,以便将来处理

type errValidation struct {
    error
}

func ValidationError(err error) error {
    return errValidation{err}
}

但是,如果我尝试将此包装的对象validator.ValidationErrors从上面的第一种情况转换到刚好在转换下面的相同功能中,则会失败

e := ValidationError(err)
if _, ok := e.(validator.ValidationErrors); ok {
    fmt.Println("ValidationError: OK")
} else{
    fmt.Println("ValidationError: FALSE")
}

我在控制台中看到

ValidateModel: OK
ValidationError: FALSE

我该如何从包装的对象中进行投射?

ValidationErrors"gopkg.in/go-playground/validator.v9"看起来像这样

type ValidationErrors []FieldError
func (ve ValidationErrors) Error() string {
     //.....
}

阅读 291

收藏
2020-07-02

共1个答案

小编典典

您的errValidation类型和validator.ValidationErrors类型完全不同,类型不同。如果接口值包含具体类型的值errValidation,则不能仅通过类型断言另一个具体类型errValidation

所以这将工作:

e := ValidationError(errors.New("some err"))
if _, ok := e.(errValidation); ok {
    fmt.Println("ValidationError: OK")
} else {
    fmt.Println("ValidationError: FALSE")
}

输出将是(在Go Playground上尝试):

ValidationError: OK
2020-07-02