【发布时间】:2014-08-14 06:38:07
【问题描述】:
我试图在 golang 中测试对象的确切类型(服装结构或接口),并试图弄清楚如何做到这一点,不是真正像便宜货黑客。 (请注意,我要问的不是字符串、整数、浮点数、切片等内置类型)。
假设我有一个实现 Speak 方法的 Animal 接口:
type Animal interface {
Speak() string
}
以及实现该接口的 Dog 结构:
type Dog struct {
}
func (d Dog) Speak() string {
return "Woof!"
}
假设我有一些变量 x,我如何检查它的结构类型并采取相应措施?
例如,我想要类似的东西:
func isDog(thing Animal{}) bool {
if reflect.TypeOf(thing) == packageName.Dog{
return true
}else{
return false
}
}
我想到的唯一解决方案并不是我真正想做的,但我想它有效。首先创建一个我要检查的类型的空结构,然后使用反射包检查是否相等。比如:
func isDog(thing Interface{}) bool {
d := Dog{}
if reflect.TypeOf(thing) == reflect.TypeOf(d){
return true
}else{
return false
}
}
我不太喜欢这样的原因是,假设我有一个更大的代码,我最终需要一个 switch 语句。然后,我必须编写很多我觉得没有必要的额外代码,例如,我需要创建许多空结构类型的数量,因为我有案例。这似乎没有必要而且非常丑陋。这是唯一的方法吗?我还希望它对我来说足够灵活,它也可以检查指针。比如:
func isDog(thing Interface{}) bool {
d := Dog{}
if reflect.TypeOf(thing) == packageName.Dog{
return true
}else if reflect.TypeOf(thing) == *packageName.Dog{
return true
}else{
return false
}
}
【问题讨论】: