Есть ли способ составить потенциально неудачные операции в 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)