什么是" go"去检查自定义类型的方法?

时间:2014-06-24 05:50:19

标签: types go

我试图在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
    }
}

2 个答案:

答案 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
}