不可能的开关盒

时间:2014-07-06 07:07:33

标签: 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:
        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

2 个答案:

答案 0 :(得分:11)

您有两种不同的类型,Validator和指针类型*Validator,这两种类型具有不同的方法集。

您只为{}指定了Error()方法,而Validator没有此方法。

您可以做的是以下更改:

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

...

case *Validator, Validator: // You are actually getting a *Validator

这为Error()Validator实施*Validator。正如 Go specification 所说:

  

任何其他类型T的方法集包含用接收器类型T声明的所有方法。   相应指针类型* T的方法集是声明的所有方法的集合   接收器* T或T(也就是说,它还包含T的方法集)

答案 1 :(得分:5)

编译器是正确的。 Validator类型未实现Error*Validator不会。 Validator*Validator是不同的类型。只需在类型开关中用后者替换前者:

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

Go Playground上的工作示例:http://play.golang.org/p/aWqzPXweiA