此程序无法编译:
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
。
答案 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