为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕桂英546537 2021-09-21 20:44:37
我知道 Go 将来不会有泛型,并且有一些建议可以用其他构造替换它们。但是在我下面的例子中,我被卡住了。func P(any interface{}, err error) (interface{}) {    if err != nil {        panic("error: "+ err.Error())    }    return any}正如您可能猜到的那样,我试图在任何错误上失败,并希望将P()任何返回两个结果的函数放在一起,而第二个是错误。这工作正常,但any丢失了它的类型信息,结果中只是一个空接口。因为我也在调用 lib 函数,所以我没有看到用接口或反射来解决这个问题的方法。有任何想法吗?我是完全在错误的轨道上还是接近目标?
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

一种解决方案是针对go generate您的P()功能,针对您需要使用的每种具体类型。
请参阅以下示例:

  • "使用 " go generate" "在 Go 中进行通用编程。

  • “乔肖/根根”

  • “厚脸皮/珍妮”

  • “剪刀屋/一代”

  • “在 Go 中实现类型泛型函数,不使用反射”

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


查看完整回答
反对 回复 2021-09-21
?
holdtom

TA贡献1805条经验 获得超10个赞

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

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

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

或者“类似”的功能,它们抑制error但如果仍然发生,恐慌,例如:

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


查看完整回答
反对 回复 2021-09-21
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

如果您计划只是对错误感到恐慌(坏主意)或记录它们,那么只需定义一个函数来执行此操作并使用它。例如


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事情,因为根据我的经验,每三个错误,如果不是第二个,都需要一些额外的处理。


查看完整回答
反对 回复 2021-09-21
  • 3 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信