为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中创建多级错误子类型

如何在 Go 中创建多级错误子类型

Go
慕少森 2023-06-26 15:32:06
我试图在 GO 中创建错误的子类型。现在我面临着多种类型的问题。以下代码显示了错误类型定义:/* Interfaces */type UniversalError interface {    CommonError1}type CommonError1 interface {    error    CommonError1()}/* Structs */type Error1 struct {    reason string}type Error2 struct {    reason string}type Error3 struct {    reason string}/* Interface function implementations */func (error1 Error1) Error() string {    return fmt.Sprintf(error1.reason)}func (error2 Error2) Error() string {    return fmt.Sprintf(error2.reason)}func (error3 Error3) Error() string {    return fmt.Sprintf(error3.reason)}func (Error1) CommonError1() {}func (Error2) CommonError1() {}func (Error3) UniversalError() {}当我尝试运行以下代码时:func main() {    var err1 = Error1{reason: "Error reason 1"}    var err2 = Error2{reason: "Error reason 2"}    var err3 = Error3{reason: "Error reason 3"}    fmt.Println("\n**** Types *****")    printType(err1)    printType(err2)    printType(err3)}func printType(param error) {    switch param.(type) {    case UniversalError:        switch param.(type) {        case CommonError1:            switch param.(type) {            case Error1:                fmt.Println("Error1 found")            case Error2:                fmt.Println("Error2 found")            default:                fmt.Println("CommonError1 found, but Does not belong to Error1 or Error2")            }        default:            fmt.Println("Error3 Found")        }    default:        fmt.Println("Error belongs to an unidentified type")    }}该printType()函数打印以下内容:**** Types *****Error1 foundError2 foundCommonError1 found, but Does not belong to Error1 or Error2我需要将 的类型Error3识别为 an UniversalError,而不是 a CommonError1。我怎样才能做到这一点?我的做法有什么问题吗?
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

您使用该UniversalError()方法,但没有将其添加到接口“定义”中,因此请执行以下操作:


type UniversalError interface {

    CommonError1

    UniversalError()

}

而你想Error3成为一个UniversalError. 要Error3成为UniversalError,它必须实现其所有方法:UniversalError()和CommonError1()。所以你必须添加这两个方法:


func (Error3) CommonError1()   {}

func (Error3) UniversalError() {}

通过这些更改,输出将是(在Go Playground上尝试):


**** Types *****

Error belongs to an unidentified type

Error belongs to an unidentified type

CommonError1 found, but Does not belong to Error1 or Error2

提示:如果您希望编译时保证某些具体类型实现某些接口,请使用空白变量声明,如下所示:


var _ UniversalError = Error3{}

上面的声明将 的值赋给Error3类型为 的变量UniversalError。不应该Error3满足UniversalError,您会收到编译时错误。上面的声明不会引入新变量,因为使用了空白标识符,这只是编译时检查。


如果您要删除该Error3.CommonError1()方法:


//func (Error3) CommonError1()   {}

func (Error3) UniversalError() {}

然后你会立即得到一个编译时错误:


./prog.go:49:5: cannot use Error3 literal (type Error3) as type UniversalError in assignment:

    Error3 does not implement UniversalError (missing CommonError1 method)



查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信