Есть ли способ составить потенциально неудачные операции в Go?

Большая часть кода, который я читаю, часто встречается по следующей схеме:

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

В функциональном программировании мы имеем Either монада и ее кузены (например, Скала Try), которые позволяют нам составлять неудачные операции, не повторяя себя постоянно.

Есть ли эквивалент, который помогает обеззараживать код?

1 ответ

Решение

Читая немного дальше, в частности, этот SO-ответ, кажется, что идиоматический подход предпочитает обрабатывать ошибки на месте вызова, а не распространять потенциальную ошибку вверх (что благоприятствует монадическому подходу).

Следуя этой линии мышления:

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)
Другие вопросы по тегам