Go 不可能型开关箱

Go 不可能型开关箱,go,Go,此程序不编译: package main type Validator struct { } // Error implements error interface func (v *Validator) Error() string { return "" } func test() error { return &Validator{} } func main() { switch test().(type) { case nil:

此程序不编译:

package main

type Validator struct {
}

// Error implements error interface
func (v *Validator) Error() string {
    return ""
}

func test() error {
    return &Validator{}
}

func main() {
    switch test().(type) {
    case nil:
        println("No error")
    case Validator:
        println("Validation error")
        return
    default:
        println("Unknown error")
        return
    }
}
错误是:

prog.go:19: impossible type switch case: test() (type error) cannot have dynamic type Validator (missing Error method)

但是
Validator
struct有方法
Error
您有两种不同的类型,
Validator
和指针类型
*Validator
,这两种类型有不同的方法集

您只为指针定义了一个
Error()
方法,而
验证器
没有此方法

您可以做以下更改:

// Error implements error interface
func (v Validator) Error() string {
    return ""
}

这将为
验证程序
*验证程序
实现
Error()
。正如所说:

任何其他类型T的方法集由使用接收方类型T声明的所有方法组成。 对应指针类型*T的方法集是使用 receiver*T或T(也就是说,它还包含T的方法集)


编译器是正确的<代码>验证程序类型未实现
错误
*验证程序
执行<代码>验证程序和
*验证程序
是不同的类型。只需在类型开关中将前者替换为后者:

switch test().(type) {
case nil:
    println("No error")
case *Validator:
    println("Validation error")
    return
default:
    println("Unknown error")
    return
}

Go操场上的工作示例:

关于何时在指向对象的指针或对象本身上定义方法,您有什么建议吗?1时在指针上定义方法。您需要修改对象。2.它是一个大对象,复制它很昂贵。在这种情况下,验证器的大小为0,因此使用它显然比使用指针要好。
switch test().(type) {
case nil:
    println("No error")
case *Validator:
    println("Validation error")
    return
default:
    println("Unknown error")
    return
}