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()功能,一个用于您需要使用的每种具体类型.
参见以下示例:
go generate" ".这将使调用这些lib函数更容易,因为生成的具体P()实现将使用正确的类型而不是接口{}.
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
| 归档时间: |
|
| 查看次数: |
2890 次 |
| 最近记录: |