Go是否提供了一个标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?[副本]

zf2sa74q  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(101)
    • 此问题已在此处有答案**:

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中,处理这个错误(不忽略它)可以很简单:

  1. let x = foo().unwrap() + 1;

在Go中,推荐的方法似乎是:

  1. x, err := Foo()
  2. if err != nil {
  3. panic(err)
  4. }
  5. x = x + 1

Go是否提供了一种标准的方式来处理像Rust这样的单个语句中的错误?还是我应该坚持自己的解决方案?
我的特别解决方案是:

  1. func unwrap[T any](val T, err error) T {
  2. if err != nil {
  3. panic(err)
  4. } else {
  5. return val
  6. }
  7. }
  • 我对过度的节制感到有点惊讶。这五个问题没有一个是重复的,也没有一个具体回答我的问题。有些甚至看起来完全不相关。我想这是因为我的标题措辞不当。我已经改写了标题,以更符合我的实际问题。感谢u/norbjd充分回答了我的问题。*
cunj1qz1

cunj1qz11#

正如@mkopriva在评论中所说,在Go中没有内置的方法来做到这一点。但是,您可以在许多命名为Must的库中找到此模式:

有一个open proposal on Go to add a generic must.Do method,但还没有具体的。
现在推荐的方法是在代码中用泛型定义Must方法(从Go 1.18开始),就像你已经做的那样:

  1. func Must[T any](v T, err error) T {
  2. if err != nil {
  3. panic(err)
  4. }
  5. return v
  6. }

然后像这样使用它:

  1. import (
  2. "errors"
  3. "fmt"
  4. )
  5. func Foo() (int, error) {
  6. return 1, nil
  7. }
  8. func Bar() (int, error) {
  9. return 0, errors.New("some error")
  10. }
  11. func main() {
  12. foo := Must(Foo())
  13. fmt.Println(foo)
  14. bar := Must(Bar()) // this will panic with "some error"
  15. fmt.Println(bar)
  16. }

有一些尝试创建库来提供这种方法,如wingyplus/must,但正如repo所述,基于Go哲学:
一点抄袭胜过一点依赖。
因此,你可以在每个项目中定义自己的方法,或者使用这些类型的库,直到Must集成到Go标准库中(如果它曾经集成过)。

展开查看全部

相关问题