- 此问题已在此处有答案**:
Golang idiomatic error handling(3个答案)
How can I further my understanding of why Go handles errors the way it does? [closed](1个答案)
Go error handling, what's the idiomatic way for making things DRY(2个答案)
Less verbose error handling in Go?(1个答案)
Handling multiple errors in go(4个答案)
上个月关门了。
截至13天前,社区正在审查是否重新讨论这个问题。
在Rust中,Result
类型,可以被认为是Go中的(val, err)
模式,可以在它出现的语句中立即“展开”,而不需要多行专门用于此任务的复杂性。例如,假设我们有一个函数foo
,它返回一个数字或一个错误。在Rust中,处理这个错误(不忽略它)可以很简单:
let x = foo().unwrap() + 1;
在Go中,推荐的方法似乎是:
x, err := Foo()
if err != nil {
panic(err)
}
x = x + 1
Go是否提供了一种标准的方式来处理像Rust这样的单个语句中的错误?还是我应该坚持自己的解决方案?
我的特别解决方案是:
func unwrap[T any](val T, err error) T {
if err != nil {
panic(err)
} else {
return val
}
}
- 我对过度的节制感到有点惊讶。这五个问题没有一个是重复的,也没有一个具体回答我的问题。有些甚至看起来完全不相关。我想这是因为我的标题措辞不当。我已经改写了标题,以更符合我的实际问题。感谢u/norbjd充分回答了我的问题。*
1条答案
按热度按时间cunj1qz11#
正如@mkopriva在评论中所说,在Go中没有内置的方法来做到这一点。但是,您可以在许多命名为
Must
的库中找到此模式:text/template
中:Must
regexp
中:MustCompile
net/netip
中:MustParseAddr
有一个open proposal on Go to add a generic
must.Do
method,但还没有具体的。现在推荐的方法是在代码中用泛型定义
Must
方法(从Go 1.18开始),就像你已经做的那样:然后像这样使用它:
有一些尝试创建库来提供这种方法,如
wingyplus/must
,但正如repo所述,基于Go哲学:一点抄袭胜过一点依赖。
因此,你可以在每个项目中定义自己的方法,或者使用这些类型的库,直到
Must
集成到Go标准库中(如果它曾经集成过)。