【问题标题】:is there a Generic way to assert type? [duplicate]有没有一种断言类型的通用方法? [复制]
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 2021-07-19
    • 2018-06-30
    • 1970-01-01
    • 2021-11-18
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多