如果是多值返回函数,则在调用该函数时无法引用结果的特定值的字段或方法。
如果其中一个是error
,它在那里是为了reason(这是函数might失败)你应该not绕过它,因为如果你这样做,你的后续代码might也会严重失败(例如导致运行时恐慌)。
然而,在某些情况下您可能know该代码在任何情况下都不会失败。在这些情况下,您可以提供helper函数(或方法)将丢弃error
(或者如果仍然发生,则引发运行时恐慌)。
如果您通过代码为函数提供输入值,并且您知道它们可以工作,则可能会出现这种情况。
很好的例子是template http://golang.org/pkg/text/template/ and regexp http://golang.org/pkg/regexp/包:如果您在编译时提供有效的模板或正则表达式,则可以确保它们始终可以在运行时被解析而不会出现错误。为此template
包提供了Must(t *Template, err error) *Template http://golang.org/pkg/text/template/#Must函数和regexp
包提供了MustCompile(str string) *Regexp http://golang.org/pkg/regexp/#MustCompile功能:他们不返回error
因为它们的预期用途是保证输入有效。
例子:
// "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]+\]$`)
回到你的案例
IF你可以确定Get()
不会产生error
对于某些输入值,您可以创建一个助手Must()
不会返回的函数error
但如果仍然发生,则会引发运行时恐慌:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
但您不应该在所有情况下都使用此方法,除非您确信它会成功。用法:
val := Must(Get(1)).Value
Go 1.18 泛型更新:Go 1.18 添加了泛型支持,现在可以编写泛型Must()
功能:
func Must[T any](v T, err error) T {
if err != nil {
panic(err)
}
return v
}
这可以在github.com/icza/gog https://pkg.go.dev/github.com/icza/gog, as gog.Must() https://pkg.go.dev/github.com/icza/gog#Must(披露:我是作者)。
替代/简化
如果您合并,您甚至可以进一步简化它Get()
调用你的辅助函数,让我们调用它MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Usage:
val := MustGet(1).Value
查看一些有趣/相关的问题:
如何将多个返回值传递给可变参数函数? https://stackoverflow.com/questions/52653779/how-to-parse-multiple-returns-in-golang/52654950#52654950
在普通函数上返回 Golang 中类似“ok”的映射 https://stackoverflow.com/questions/28487036/return-map-like-ok-in-golang-on-normal-functions/28487270#28487270