登录
首页 >  Golang >  Go问答

当我尝试将对象封装成自定义类型时,Golang 会出现转换失败

来源:stackoverflow

时间:2024-03-11 11:27:25 318浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《当我尝试将对象封装成自定义类型时,Golang 会出现转换失败》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

在我的应用程序中,我使用 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-演示/validator.v9" 看起来像这样

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

解决方案


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

以上就是《当我尝试将对象封装成自定义类型时,Golang 会出现转换失败》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>