PHpullh
학습 라이브러리/Go/제네릭 함수 & 타입 제약

GO · 함수

제네릭 함수 & 타입 제약

Go 1.18+의 제네릭은 타입 파라미터로 코드 재사용성을 높입니다. constraints 패키지의 인터페이스로 타입을 제약하고, ~ 틸드로 기반 타입(underlying type)까지 허용할 수 있습니다.

함수중급genericstype-constraintstype-parametersgo118

핵심 설명

Go 1.18+의 제네릭은 타입 파라미터로 코드 재사용성을 높입니다. constraints 패키지의 인터페이스로 타입을 제약하고, ~ 틸드로 기반 타입(underlying type)까지 허용할 수 있습니다.

Go code

package main

import (
	"cmp"
	"fmt"
	"golang.org/x/exp/constraints"
)

// 1. 기본 제네릭 함수
func Map[T any, U any](slice []T, fn func(T) U) []U {
	result := make([]U, len(slice))
	for i, v := range slice {
		result[i] = fn(v)
	}
	return result
}

func Filter[T any](slice []T, pred func(T) bool) []T {
	var result []T
	for _, v := range slice {
		if pred(v) {
			result = append(result, v)
		}
	}
	return result
}

// 2. 타입 제약 인터페이스
type Number interface {
	~int | ~int64 | ~float64
}

func Sum[T Number](nums []T) T {
	var total T
	for _, n := range nums {
		total += n
	}
	return total
}

// 3. 커스텀 타입도 ~ 틸드로 허용
type Score int

// 4. 제네릭 구조체
type Pair[T, U any] struct {
	First  T
	Second U
}

func NewPair[T, U any](first T, second U) Pair[T, U] {
	return Pair[T, U]{First: first, Second: second}
}

// 5. cmp.Ordered 활용 (Go 1.21+)
func MaxOf[T cmp.Ordered](a, b T) T {
	if a > b {
		return a
	}
	return b
}

func main() {
	// Map & Filter
	nums := []int{1, 2, 3, 4, 5}
	doubled := Map(nums, func(n int) int { return n * 2 })
	evens := Filter(nums, func(n int) bool { return n%2 == 0 })
	fmt.Println("2배:", doubled)     // [2 4 6 8 10]
	fmt.Println("짝수:", evens)       // [2 4]

	// Number 제약
	scores := []Score{85, 92, 78, 95}
	fmt.Println("점수 합:", Sum(scores)) // Score 타입도 OK

	// 제네릭 Pair
	pair := NewPair("이름", 42)
	fmt.Printf("Pair: %s=%d\n", pair.First, pair.Second)

	// MaxOf
	fmt.Println("최댓값:", MaxOf(3.14, 2.71))
}

학습 팁

anyinterface{}의 별칭이며, comparable== 연산이 가능한 타입을 의미합니다. 가능하면 cmp.Ordered 같은 표준 제약을 활용하세요.

주의할 점

제네릭 타입 파라미터에 ~int 틸드를 빼면 커스텀 타입(type Score int)이 제약을 만족하지 못합니다. 기반 타입을 허용하려면 반드시 ~를 사용하세요.

자주 묻는 질문

제네릭 함수 & 타입 제약란 무엇인가요?

Go 1.18+의 제네릭은 타입 파라미터로 코드 재사용성을 높입니다. constraints 패키지의 인터페이스로 타입을 제약하고, ~ 틸드로 기반 타입(underlying type)까지 허용할 수 있습니다.

제네릭 함수 & 타입 제약 학습 시 주의할 점은 무엇인가요?

제네릭 타입 파라미터에 ~int 틸드를 빼면 커스텀 타입( type Score int )이 제약을 만족하지 못합니다. 기반 타입을 허용하려면 반드시 ~ 를 사용하세요.