PHpullh
학습 라이브러리/Go/제네릭 활용 FP

GO · 함수형

제네릭 활용 FP

제네릭으로 타입 안전한 함수형 유틸리티를 구현합니다. 슬라이스 변환, 접기, 그룹핑 등을 다룹니다.

함수형고급genericsflatmappartitionchunkunique

핵심 설명

제네릭으로 타입 안전한 함수형 유틸리티를 구현합니다. 슬라이스 변환, 접기, 그룹핑 등을 다룹니다.

Go code

package main

import "fmt"

func FlatMap[T, U any](s []T, fn func(T) []U) []U {
	var result []U
	for _, v := range s {
		result = append(result, fn(v)...)
	}
	return result
}

func Partition[T any](s []T, pred func(T) bool) (yes, no []T) {
	for _, v := range s {
		if pred(v) { yes = append(yes, v) } else { no = append(no, v) }
	}
	return
}

func Chunk[T any](s []T, size int) [][]T {
	var chunks [][]T
	for i := 0; i < len(s); i += size {
		end := i + size
		if end > len(s) { end = len(s) }
		chunks = append(chunks, s[i:end])
	}
	return chunks
}

func Unique[T comparable](s []T) []T {
	seen := make(map[T]struct{})
	var result []T
	for _, v := range s {
		if _, ok := seen[v]; !ok {
			seen[v] = struct{}{}
			result = append(result, v)
		}
	}
	return result
}

func main() {
	words := []string{"hello world", "go lang"}
	chars := FlatMap(words, func(s string) []byte { return []byte(s) })
	fmt.Println(string(chars))

	nums := []int{1, 2, 3, 4, 5, 6}
	even, odd := Partition(nums, func(n int) bool { return n%2 == 0 })
	fmt.Println("짝수:", even, "홀수:", odd)

	fmt.Println("청크:", Chunk(nums, 2))
	fmt.Println("중복제거:", Unique([]int{1, 2, 2, 3, 3}))
}

학습 팁

Go 1.23+의 iter 패키지와 range-over-func를 사용하면 지연 평가(lazy evaluation)도 가능합니다.

주의할 점

FlatMap이나 Chunk에서 빈 슬라이스를 처리하지 않으면 nil 반환으로 인한 버그가 발생합니다. 항상 빈 입력을 고려하세요.

자주 묻는 질문

제네릭 활용 FP란 무엇인가요?

제네릭으로 타입 안전한 함수형 유틸리티를 구현합니다. 슬라이스 변환, 접기, 그룹핑 등을 다룹니다.

제네릭 활용 FP 학습 시 주의할 점은 무엇인가요?

FlatMap 이나 Chunk 에서 빈 슬라이스를 처리하지 않으면 nil 반환으로 인한 버그가 발생합니다. 항상 빈 입력을 고려하세요.