首页 > 解决方案 > 有没有一种断言类型的通用方法?

问题描述

我发现自己编写了 X 次相同的函数来从我的 go-cache 中获取不同类型的项目。重复的功能是这样的:

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

我理解。我不明白如何删除这种重复并具有通用功能。

标签: go

解决方案


Go 没有泛型,所以你想要的是不可能的。如果这真的困扰你,你可以使用反射来传递reflect.Type你想要的值,使用反射来创建和组装结果切片,但它会比你的单个函数慢。

您还可以使用类型开关来减少代码重复,但不能使用“动态”返回类型。所以调用者仍然必须对返回值使用类型断言。


推荐阅读