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, ...) 처럼 타입을 지정하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.