有没有办法在 Go 中组合可能失败的操作?

Is there a way to compose potentially failing operations in Go?

我阅读的大多数 go 代码都经常出现以下模式:

result1, err := failingOp1()
if err != nil {
    return err
}
dependingResult, err := failingOp2(result1)
if err != nil {
    return err
}
// do stuff with dependingResult

在函数式编程中,我们有 Either monad 及其同类(例如 Scala 的 Try),它们允许我们编写失败的操作而无需不断重复自己。

是否有有助于整理代码的 go 等价物?

进一步阅读,特别是 this SO answer,似乎惯用的 go 更喜欢在调用站点处理错误,而不是向上传播潜在的错误(monadic 方法有利于)。

按照这个思路:

func wrapFailingOp1() ResultType {
  result1, err := failingOp1()
  if err != nil {
    return defaultRTOrPanic()
  }
  return result1
}

func wrapFailingOp2(result1 ResultType) DependingResultType {
    dependingResult, err := failingOp2(result1)
    if err != nil {
        return defaultDRTOrPanic()
    }
    return dependingResult
}

x := wrapFailingOp1()
y := wrapFailingOp2(x)