我发现自己写了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
我了解。我不明白如何删除此重复项并具有通用功能。
答案 0 :(得分:3)
Go没有泛型,因此您想要的东西是不可能的。如果这确实使您感到困扰,则可以使用反射来传递所需的reflect.Type
值,使用反射来创建和组合该结果切片,但它会比您的单个函数慢。
您还可以使用type switch来减少代码重复,但是不能具有“动态”返回类型。因此,调用方仍然必须在返回值上使用类型断言。