有没有办法在 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)
我阅读的大多数 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)