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
}