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

时间:2017-03-24 10:55:22

标签: go error-handling either

我阅读的大多数代码都包含以下模式的频繁出现:

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

在函数式编程中,我们有Either monad及其堂兄弟(例如Scala' s Try),它们允许我们在不经常重复的情况下编写失败的操作。

是否存在有助于整理代码的等效内容?

1 个答案:

答案 0 :(得分:1)

进一步阅读,特别是this SO answer,似乎惯用的是更喜欢在呼叫站点处理错误而不是向上传播潜在的错误(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)