在多值返回函数的情况下,调用函数时不能引用结果的特定值的字段或方法。
如果其中一个是error
,它的存在是有原因的(即函数可能会失败),你不应该绕过它,因为如果你这样做了,你的后续代码也可能会失败(例如导致运行时恐慌)。
但是,在某些情况下,您可能知道代码在任何情况下都不会失败。在这些情况下,您可以提供一个辅助函数(或方法),它将丢弃error
(如果仍然发生,则引发运行时恐慌)。
如果您从代码中为函数提供输入值,并且您知道它们有效,则可能会出现这种情况。和包
就是很好的例子:如果你在编译时提供了一个有效的模板或正则表达式,你可以确保它们在运行时总是可以被解析而没有错误。出于这个原因,包提供了功能,包提供了功能:它们不返回template
regexp
template
Must(t *Template, err error) *Template
regexp
MustCompile(str string) *Regexp
error
s 因为它们的预期用途是保证输入有效的地方。
例子:
// "text" is a valid template, parsing it will not fail
var t = template.Must(template.New("name").Parse("text"))
// `^[a-z]+\[[0-9]+\]$` is a valid regexp, always compiles
var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
回到你的案例
如果您可以确定Get()
不会error
为某些输入值生成,您可以创建一个辅助Must()
函数,它不会返回error
但如果仍然发生则引发运行时恐慌:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
但是你不应该在所有情况下都使用它,只是当你确定它成功时。用法:
val := Must(Get(1)).Value
替代/简化
如果您将调用合并到您的辅助函数中,您甚至可以进一步简化它Get()
,我们称之为MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
用法:
val := MustGet(1).Value
查看一些有趣/相关的问题:
如何在golang中解析多个返回
在普通函数上返回像 Golang 中的 'ok' 之类的映射