有通用的断言类型吗?

时间:2019-10-29 16:37:31

标签: go

我发现自己写了X次相同的函数,以便从go-cache中获取不同类型的Items。重复的功能如下:

func TCPChecks() []*TCPCheck {
    var result []*TCPCheck
    for _, item := range Cache.Items() {
        if check, ok := item.Object.(*TCPCheck); ok {
            result = append(result, check)
        }
    }
    return result
}

func HTTPChecks() []*HTTPCheck {
    var result []*HTTPCheck
    for _, item := range Cache.Items() {
        if check, ok := item.Object.(*HTTPCheck); ok {
            result = append(result, check)
        }
    }
    return result
}

func VersionChecks() []*VersionCheck {
    var result []*VersionCheck
    for _, item := range Cache.Items() {
        if check, ok := item.Object.(*VersionCheck); ok {
            result = append(result, check)
        }
    }
    return result
}

func PodChecks() []*PodCheck {
    var result []*PodCheck
    for _, item := range Cache.Items() {
        if check, ok := item.Object.(*PodCheck); ok {
            result = append(result, check)
        }
    }
    return result
}

我确定总体上我做错了事,但我仍处于实验阶段,正在发挥作用。

我的问题:

有没有一种方法可以编写这样的功能

func ChecksByType(t Type) []*Check {
    var result []*Check
    for _, item := range Cache.Items() {
        if check, ok := item.Object.(t); ok {
            result = append(result, check)
        }
    }
    return result
}

ChecksByType(*PodCheck)

我以前的尝试导致错误

t is not a type

我了解。我不明白如何删除此重复项并具有通用功能。

1 个答案:

答案 0 :(得分:3)

Go没有泛型,因此您想要的东西是不可能的。如果这确实使您感到困扰,则可以使用反射来传递所需的reflect.Type值,使用反射来创建和组合该结果切片,但它会比您的单个函数慢。

您还可以使用type switch来减少代码重复,但是不能具有“动态”返回类型。因此,调用方仍然必须在返回值上使用类型断言。