不可能的开关盒

war*_*iuc 11 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
    }
}
Run Code Online (Sandbox Code Playgroud)

错误是:

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

Validator结构有方法Error.

ANi*_*sus 11

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

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

您可以做的是以下更改:

// Error implements error interface
func (v Validator) Error() string {
    return ""
}
Run Code Online (Sandbox Code Playgroud)

...

case *Validator, Validator: // You are actually getting a *Validator
Run Code Online (Sandbox Code Playgroud)

Error()适用于Validator*Validator.正如Go规范所说:

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


Ain*_*r-G 7

编译器是正确的.Validator类型不落实Error,*Validator不.Validator并且*Validator是不同的类型.只需在类型开关中用后者替换前者:

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

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