猿问

如果我包装我的对象,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 {

     //.....

}


慕码人8056858
浏览 117回答 1
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
随时随地看视频慕课网APP

相关分类

Go
我要回答