当前位置: 首页 > 面试题库 >

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

秦才
2023-03-14
问题内容

我试图在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标识为UniversalError,而不是CommonError1。我怎样才能做到这一点?我的方法有什么问题吗?


问题答案:

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

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

上面的声明将的值分配给Error3type的变量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)


 类似资料:
  • 问题内容: 我想在Go中创建分层错误。我们可以在Go中实现吗?例如,我有以下两个错误。 我想要一个包含两个子类型和的错误类型,以便执行以下操作。 有办法实现吗? 编辑: 在类型切换中,我们可以使用多个错误,如下所示: 但是,当我遇到大量错误时,或者当我需要对模块内部的错误进行抽象时,这种方法将不是最好的方法。 问题答案: 您可以在中列出多个类型,这样便可以完成您想做的事情: 测试它: 输出(在Go

  • 问题内容: 我的.htaccess将所有请求重定向到。然后,PHP脚本检查请求的页面是否在其页面数组中。 如果没有,如何模拟错误404?我试过了,但是并没有导致我的404页面在出现时通过配置。 我是否认为重定向到错误404页面是错误的? 问题答案: 用于生成404页的最新答案(从PHP 5.4或更高版本开始)是使用: 并非绝对必要,但是可以确保您不会继续正常执行。

  • 当我只有product类和两个用继承策略扩展product的类时,单表(product- 必须在根实体中定义鉴别器列,它将在子类com中被忽略。实例演示。实体电子学 产品类别 电子类: 智能手机类别: 我想把电子学课分成两个不同领域的实体。

  • 我正在使用grpc protobuf消息定义,并在Go中实现它们。 我的最终目标是让我的rpc在用户上检索一些json并返回带有可选嵌套消息的Message,用于解组json的子集。 使用此rpc: 假设如下: 我想返回一个消息,该消息仅包含“foo”、“bar”或两者,作为基于grpc请求的传入运行时参数的嵌套消息(目前,将是包含用于将json子设置为相应消息的消息名称的字符串列表,例如)。 给

  • 问题内容: 出于某种原因,在以下代码段中似​​乎无法使用构造函数委托: 运行此给出。关于为什么的任何想法,或者是否有更好的方法来创建新的子类?我不知道的本地构造函数存在问题吗? 问题答案: 更新您的代码以将原型分配给Error.prototype和instanceof以及您的assert工作。 但是,我只是抛出您自己的对象并只检查name属性。 根据评论进行编辑 在查看了注释并试图记住为什么要分配

  • 问题内容: 我正在尝试SlugField在Django中创建一个。 我创建了这个简单的模型: 然后,我这样做: 我在期待 问题答案: 有一些utf-8字符的特殊情况 例: 这可以用Unidecode解决