【发布时间】:2022-01-28 09:19:08
【问题描述】:
我知道 Go 将来不会有泛型,并且有一些建议可以用其他构造替换它们。但是在下面的示例中,我陷入了困境。
func P(any interface{}, err error) (interface{}) {
if err != nil {
panic("error: "+ err.Error())
}
return any
}
正如您可能猜到的那样,我试图在任何错误上都失败,并希望将P() 放在返回两个结果且第二个是错误的任何函数周围。这工作正常,但any 丢失了它的类型信息,结果中只是一个空接口。
由于我也在调用 lib 函数,因此我看不到使用接口或反射解决此问题的方法。
有什么想法吗?我是完全走错了路还是离目标很近?
【问题讨论】:
-
别这样。只需写
if err != nil很多时间,它就不会那么烦人了。如果你写了一些完全重复的err != nils 构成了你的代码太多的东西,你可以write helpers that assign the error somewhere,或者如果某些或所有错误肯定会影响整个操作,请编写一个panic-on-unrecoverable-error wrapper,如mustWrite然后recover在它从你的包裹里出来之前从恐慌中解脱出来。 -
我建议你停止尝试将“语言 X 的做事方式”融入 Go 代码。 Go 到处都有明确的错误处理,没有真正的异常(恐慌/恢复与 C++/Java 异常不一样)。特别是,不要永远编写一个恐慌的 Go 包,例如
os.Open返回一个os.PathError。 -
即使你曾经找到一个你想对错误感到恐慌的地方,只要
panic(err)。如果未恢复,输出将几乎相同,但recover将得到原始错误而不是字符串表示形式。
标签: generics error-handling go