编写没有泛型的泛型错误处理函数

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


func P(any interface{}, err error) (interface{}) {

    if err != nil {

        panic("error: "+ err.Error())

    }

    return any

}

正如您可能猜到的那样,我试图在任何错误上失败,并希望将P()任何返回两个结果的函数放在一起,而第二个是错误。这工作正常,但any丢失了它的类型信息,结果中只是一个空接口。


因为我也在调用 lib 函数,所以我没有看到用接口或反射来解决这个问题的方法。


有任何想法吗?我是完全在错误的轨道上还是接近目标?


慕桂英546537
浏览 203回答 3
3回答

至尊宝的传说

一种解决方案是针对go generate您的P()功能,针对您需要使用的每种具体类型。请参阅以下示例:"使用 " go generate" "在 Go 中进行通用编程。“乔肖/根根”“厚脸皮/珍妮”“剪刀屋/一代”“在 Go 中实现类型泛型函数,不使用反射”这将使调用这些 lib 函数变得更容易,因为生成的具体 P() 实现将使用正确的类型而不是 interface{}。

holdtom

您想要做的将需要泛型,但正如您已经提到的,Go 不支持泛型类型。因此,您无法创建不会丢失类型的通用函数。您必须为要支持的每种类型创建这样的函数。请注意,标准库已经包含其中一些名称为MustXXX(),您可以开箱即用,例如:template.Must(t *Template, err error) *Template或者“类似”的功能,它们抑制error但如果仍然发生,恐慌,例如:regexp.MustCompile(str string) *Regexp(error如果str不是有效的正则表达式,则抑制但恐慌)

元芳怎么了

如果您计划只是对错误感到恐慌(坏主意)或记录它们,那么只需定义一个函数来执行此操作并使用它。例如func checkErr(err error) {    if err != nil {        log.Println(err)    }}// ...func foo() {    a, err := doA()    checkErr(err)    b, err := doB()    checkErr(err)    // etc.}用户 twotwotwo 已经链接到Errors are values文章,该文章展示了更多关于如何减少错误处理重复性的示例。但我建议只写整个if err != nil事情,因为根据我的经验,每三个错误,如果不是第二个,都需要一些额外的处理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go