在Go Lang中编写泛型函数而没有泛型

mhe*_*ing 14 generics error-handling go

我知道Go将来不会有泛型,并且有一些建议可以用其他结构替换它们.但是下面我的例子我被卡住了.

func P(any interface{}, err error) (interface{}) {
    if err != nil {
        panic("error: "+ err.Error())
    }
    return any
}
Run Code Online (Sandbox Code Playgroud)

正如你可能猜到的那样,我试图在任何错误上失败,并且想要放置P()任何返回两个结果的函数,第二个是错误.这工作正常,但any正在丢失它的类型信息,并且只是结果中的空接口.

因为我也在调用lib函数,所以我没有看到使用Interfaces或Reflection解决这个问题的方法.

有任何想法吗?我完全走错了轨道还是接近目标?

Von*_*onC 11

一个解决方案是go generate您的P()功能,一个用于您需要使用的每种具体类型.
参见以下示例:

这将使调用这些lib函数更容易,因为生成的具体P()实现将使用正确的类型而不是接口{}.


icz*_*cza 8

Go 1.18 泛型更新: Go 1.18 添加了泛型支持,现在可以编写泛型Must()函数:

func Must[T any](v T, err error) T {
    if err != nil {
        panic(err)
    }
    return v
}
Run Code Online (Sandbox Code Playgroud)

这可以在github.com/icza/gog, as中找到gog.Must()(披露:我是作者)。

1.18 之前的原始答案如下。


你想要做的事情需要泛型,但正如你已经提到的,Go 不支持泛型类型。因此,您无法创建不会丢失类型的通用函数。

您必须为您想要支持的每种类型创建这样的函数。请注意,标准库已包含其中一些名为 的库MustXXX(),您可以开箱即用,例如:

template.Must(t *Template, err error) *Template

或者“类似”的功能,可以抑制error但如果仍然发生,则会出现恐慌,例如:

regexp.MustCompile(str string) *Regexp(如果不是有效的正则表达式,则会抑制error但会出现恐慌)str