首页 > 解决方案 > 如果我包装我的对象,Golang 转换为自定义类型会失败

问题描述

在我的应用程序中,我validator.v9用来验证我的模型。验证后我可以转换error界面并且它成功了,我在控制台上看到“OK”

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 {
     //.....
}

标签: gocasting

解决方案


你的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

推荐阅读