【发布时间】:2019-10-29 16:37:31
【问题描述】:
我发现自己编写了 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
据我了解。我不明白如何删除这种重复并具有通用功能。
【问题讨论】:
-
我正在考虑从两个方向之一进行重新设计:最好为它们提供一个共享接口,以便在大多数情况下您不需要关心它们是什么具体的具体类型;或者如果这真的不可能,因为类型完全不同,请将它们分开缓存(如果它们完全不同,将它们全部放在一个桶中只是“一大堆东西”,比如将用户和帖子放在同一个桶中 -这毫无意义)。
-
我写了一个直接回答这个问题,但现在回答按钮不见了。这是我写的:play.golang.org/p/hurJEJCFBNv .
标签: go