GO · 함수형
Result 타입 (에러 모나드)
에러 처리를 함수형으로 체이닝하는 Result 타입을 구현합니다. Then으로 에러 전파를 자동화합니다.
함수형고급resultmonaderror-handlingfunctionalchain
핵심 설명
에러 처리를 함수형으로 체이닝하는 Result 타입을 구현합니다. Then으로 에러 전파를 자동화합니다.
Go code
package main
import (
"fmt"
"strconv"
)
type Result[T any] struct {
Value T
Err error
}
func Ok[T any](v T) Result[T] { return Result[T]{Value: v} }
func Fail[T any](err error) Result[T] { return Result[T]{Err: err} }
func Then[T, U any](r Result[T], fn func(T) Result[U]) Result[U] {
if r.Err != nil {
return Fail[U](r.Err) // 에러 전파
}
return fn(r.Value)
}
func (r Result[T]) Map(fn func(T) T) Result[T] {
if r.Err != nil { return r }
return Ok(fn(r.Value))
}
func parseAge(s string) Result[int] {
n, err := strconv.Atoi(s)
if err != nil { return Fail[int](fmt.Errorf("파싱 실패: %w", err)) }
return Ok(n)
}
func validateAge(n int) Result[int] {
if n < 0 || n > 150 { return Fail[int](fmt.Errorf("유효하지 않은 나이: %d", n)) }
return Ok(n)
}
func main() {
r := Then(parseAge("25"), validateAge)
fmt.Println(r) // {25 <nil>}
r2 := Then(parseAge("abc"), validateAge)
fmt.Println(r2.Err) // 파싱 실패
r3 := Then(parseAge("-5"), validateAge)
fmt.Println(r3.Err) // 유효하지 않은 나이
}학습 팁
Result 타입은 에러 체크 보일러플레이트를 줄여줍니다. 다만 Go의 관용적 if err != nil과 혼용할 때 주의하세요.
주의할 점
Go 커뮤니티에서 모나드 패턴은 논란이 있습니다. 팀 컨벤션을 확인하고, 표준 에러 처리가 더 적합할 수 있습니다.
자주 묻는 질문
Result 타입 (에러 모나드)란 무엇인가요?
에러 처리를 함수형으로 체이닝하는 Result 타입을 구현합니다. Then 으로 에러 전파를 자동화합니다.
Result 타입 (에러 모나드) 학습 시 주의할 점은 무엇인가요?
Go 커뮤니티에서 모나드 패턴은 논란이 있습니다. 팀 컨벤션을 확인하고, 표준 에러 처리가 더 적합할 수 있습니다.