PHpullh
학습 라이브러리/Go/Result 타입 (에러 모나드)

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 커뮤니티에서 모나드 패턴은 논란이 있습니다. 팀 컨벤션을 확인하고, 표준 에러 처리가 더 적합할 수 있습니다.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.