go - 有没有一种断言类型的通用方法?
问题描述
我发现自己编写了 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 没有泛型,所以你想要的是不可能的。如果这真的困扰你,你可以使用反射来传递reflect.Type
你想要的值,使用反射来创建和组装结果切片,但它会比你的单个函数慢。
您还可以使用类型开关来减少代码重复,但不能使用“动态”返回类型。所以调用者仍然必须对返回值使用类型断言。
推荐阅读
- python - while 循环和计数器
- flutter - 我想使用颤振导航我在网格视图中的卡片。我的卡片包含图像而不是图标
- python - Google Drive API 使用 Python 下载文件
- python - 如何在 Flask 中获取请求的参数?
- python-3.x - Tensorflow2 数据流水线如何优化?
- ruby - 在 macOS 上更新 RVM、Ruby 和 Rails
- docker - 无法使用 docker ps -a 列出已停止的容器
- java - 更新区域设置不会更改低于 Build.VERSION_CODES.N (API 24) 的 Android 版本的区域设置
- android - java.lang.SecurityException:权限拒绝:启动意图
- c# - 带有附件的 Azure 函数 POST 请求