3 回答
TA贡献1789条经验 获得超10个赞
一种解决方案是针对go generate
您的P()
功能,针对您需要使用的每种具体类型。
请参阅以下示例:
"使用 "
go generate
" "在 Go 中进行通用编程。“乔肖/根根”
“厚脸皮/珍妮”
“剪刀屋/一代”
“在 Go 中实现类型泛型函数,不使用反射”
这将使调用这些 lib 函数变得更容易,因为生成的具体 P() 实现将使用正确的类型而不是 interface{}。
TA贡献1805条经验 获得超10个赞
您想要做的将需要泛型,但正如您已经提到的,Go 不支持泛型类型。因此,您无法创建不会丢失类型的通用函数。
您必须为要支持的每种类型创建这样的函数。请注意,标准库已经包含其中一些名称为MustXXX()
,您可以开箱即用,例如:
template.Must(t *Template, err error) *Template
或者“类似”的功能,它们抑制error
但如果仍然发生,恐慌,例如:
regexp.MustCompile(str string) *Regexp
(error
如果str
不是有效的正则表达式,则抑制但恐慌)
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事情,因为根据我的经验,每三个错误,如果不是第二个,都需要一些额外的处理。
- 3 回答
- 0 关注
- 202 浏览
添加回答
举报