这个程序不编译:
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)
编译器是正确的.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