我试图在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
}
}
答案 0 :(得分:3)
要确定接口变量的动态类型,可以使用type assertion的双返回形式。例如,您的isDog
功能可以实现为:
func isDog(thing Animal) bool {
_, isdog := thing.(packageName.Dog)
_, isdogptr := thig.(*packageName.Dog)
return isdog || isdogptr
}
答案 1 :(得分:3)
惯用法是使用type switch而不是直接输入断言。
func isDog(animal Animal) bool {
switch animal.(type) {
case Dog:
case *Dog:
default:
return false
}
return true
}