PHpullh
학습 라이브러리/Go/함수형 패턴 — Map, Filter, Reduce (제네릭)

GO · 함수형

함수형 패턴 — Map, Filter, Reduce (제네릭)

Go 1.18+ 제네릭을 사용한 함수형 프로그래밍 유틸리티.

함수형중급genericMapFilterReducefunctional

핵심 설명

Go 1.18+ 제네릭을 사용한 함수형 프로그래밍 유틸리티.

Go code

package main

import "fmt"

// 제네릭 Map
func Map[T, U any](s []T, f func(T) U) []U {
	r := make([]U, len(s))
	for i, v := range s { r[i] = f(v) }
	return r
}

// 제네릭 Filter
func Filter[T any](s []T, f func(T) bool) []T {
	var r []T
	for _, v := range s { if f(v) { r = append(r, v) } }
	return r
}

// 제네릭 Reduce
func Reduce[T, U any](s []T, init U, f func(U, T) U) U {
	acc := init
	for _, v := range s { acc = f(acc, v) }
	return acc
}

// 제네릭 ForEach
func ForEach[T any](s []T, f func(int, T)) {
	for i, v := range s { f(i, v) }
}

// 제네릭 Contains
func Contains[T comparable](s []T, target T) bool {
	for _, v := range s { if v == target { return true } }
	return false
}

func main() {
	nums := []int{1, 2, 3, 4, 5}

	doubled := Map(nums, func(n int) int { return n * 2 })
	fmt.Println("doubled:", doubled)

	evens := Filter(nums, func(n int) bool { return n%2 == 0 })
	fmt.Println("evens:", evens)

	sum := Reduce(nums, 0, func(acc, n int) int { return acc + n })
	fmt.Println("sum:", sum)

	// 타입 변환 Map
	strs := Map(nums, func(n int) string {
		return fmt.Sprintf("%02d", n)
	})
	fmt.Println("strs:", strs)

	// 체이닝
	result := Reduce(
		Filter(Map(nums, func(n int) int { return n * n }),
			func(n int) bool { return n > 5 }),
		0,
		func(acc, n int) int { return acc + n },
	)
	fmt.Println("chain result:", result) // 9+16+25 = 50

	fmt.Println(Contains(nums, 3)) // true
}

학습 팁

Go의 slices 패키지(Go 1.21+)에 slices.Map, slices.Filter 같은 함수가 추가됐습니다. 표준 라이브러리를 먼저 확인하세요.

주의할 점

제네릭 함수의 타입 파라미터가 복잡해지면 타입 추론이 실패할 수 있습니다. 이 경우 명시적으로 Map[int, string](nums, ...)처럼 타입을 지정하세요.

자주 묻는 질문

함수형 패턴 — Map, Filter, Reduce (제네릭)란 무엇인가요?

Go 1.18+ 제네릭을 사용한 함수형 프로그래밍 유틸리티.

함수형 패턴 — Map, Filter, Reduce (제네릭) 학습 시 주의할 점은 무엇인가요?

제네릭 함수의 타입 파라미터가 복잡해지면 타입 추론이 실패할 수 있습니다. 이 경우 명시적으로 Map[int, string](nums, ...) 처럼 타입을 지정하세요.