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

我试图在 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 found

Error2 found

CommonError1 found, but Does not belong to Error1 or Error2

我需要将 的类型Error3识别为 an UniversalError,而不是 a CommonError1。我怎样才能做到这一点?我的做法有什么问题吗?


慕少森
浏览 132回答 1
1回答

HUH函数

您使用该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 typeError belongs to an unidentified typeCommonError1 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go