PHpullh
학습 라이브러리/Go/제네릭 함수 심화

GO · 함수

제네릭 함수 심화

복수 타입 파라미터와 제약을 조합하여 타입 안전한 유틸리티 함수를 작성합니다.

함수고급genericsgroup-bycmpslices

핵심 설명

복수 타입 파라미터와 제약을 조합하여 타입 안전한 유틸리티 함수를 작성합니다.

Go code

package main

import (
	"cmp"
	"fmt"
	"slices"
)

// 복수 타입 파라미터
func GroupBy[T any, K comparable](items []T, key func(T) K) map[K][]T {
	groups := make(map[K][]T)
	for _, item := range items {
		k := key(item)
		groups[k] = append(groups[k], item)
	}
	return groups
}

// cmp.Ordered 활용 (Go 1.21+)
func Clamp[T cmp.Ordered](val, min, max T) T {
	if val < min { return min }
	if val > max { return max }
	return val
}

func main() {
	words := []string{"go", "rust", "go", "python", "rust", "go"}
	groups := GroupBy(words, func(s string) string { return s })
	for k, v := range groups {
		fmt.Printf("%s: %d개\n", k, len(v))
	}

	fmt.Println(Clamp(15, 0, 10)) // 10
	fmt.Println(Clamp(-5, 0, 10)) // 0

	// slices 패키지 활용 (Go 1.21+)
	nums := []int{3, 1, 4, 1, 5}
	slices.Sort(nums)
	fmt.Println(nums) // [1 1 3 4 5]
}

학습 팁

Go 1.21의 slicesmaps 패키지는 제네릭 기반 유틸리티를 제공합니다. 직접 구현하기 전에 표준 라이브러리를 확인하세요.

주의할 점

제네릭 함수에서 타입 파라미터가 너무 많으면 가독성이 떨어집니다. 2-3개를 넘기면 별도 타입이나 인터페이스로 분리하세요.

자주 묻는 질문

제네릭 함수 심화란 무엇인가요?

복수 타입 파라미터와 제약을 조합하여 타입 안전한 유틸리티 함수를 작성합니다.

제네릭 함수 심화 학습 시 주의할 점은 무엇인가요?

제네릭 함수에서 타입 파라미터가 너무 많으면 가독성이 떨어집니다. 2-3개를 넘기면 별도 타입이나 인터페이스로 분리하세요.