如何创建在围棋多层次的错误亚型(How to create multi-level Error su

2019-10-29 19:25发布

我试图创建子类型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 。 我怎样才能做到这一点? 这有什么错在我的做法?

Answer 1:

您可以使用UniversalError()方法,但你没有添加到界面中的“定义”,这样做的:

type UniversalError interface {
    CommonError1
    UniversalError()
}

你想Error3是一个UniversalError 。 对于Error3是一个UniversalError ,它必须实现所有的方法: UniversalError()CommonError1() 所以,你必须同时添加这些方法:

func (Error3) CommonError1()   {}
func (Error3) UniversalError() {}

随着这些变化,输出会(尝试在转到操场 ):

**** 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)


文章来源: How to create multi-level Error subtypes in Go