PHpullh
학습 라이브러리/Go/제네릭 타입 제약 심화

GO · 함수

제네릭 타입 제약 심화

유니온 타입, 메서드 제약, ~ 연산자를 조합하여 정교한 타입 제약을 만듭니다.

함수고급constraintsnumericuniontilde

핵심 설명

유니온 타입, 메서드 제약, ~ 연산자를 조합하여 정교한 타입 제약을 만듭니다.

Go code

package main

import "fmt"

// 유니온 + 틸드 조합
type Numeric interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 |
	~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 |
	~float32 | ~float64
}

// 메서드 제약
type Stringable interface {
	~int | ~string
	String() string
}

func Abs[T Numeric](n T) T {
	if n < 0 { return -n }
	return n
}

func MinMax[T Numeric](nums []T) (T, T) {
	min, max := nums[0], nums[0]
	for _, n := range nums[1:] {
		if n < min { min = n }
		if n > max { max = n }
	}
	return min, max
}

type Celsius float64
type Fahrenheit float64

func main() {
	fmt.Println(Abs(-42))     // 42
	fmt.Println(Abs(Celsius(-10))) // 10

	min, max := MinMax([]int{3, 1, 4, 1, 5, 9})
	fmt.Printf("min=%d, max=%d\n", min, max)
}

학습 팁

표준 라이브러리의 cmp.Ordered는 이미 모든 정렬 가능 타입을 포함합니다. 커스텀 제약은 특수한 경우에만 만드세요.

주의할 점

유니온 타입 제약에 ~를 빠뜨리면 기저 타입이 같은 커스텀 타입(type Celsius float64)이 제외됩니다.

자주 묻는 질문

제네릭 타입 제약 심화란 무엇인가요?

유니온 타입, 메서드 제약, ~ 연산자를 조합하여 정교한 타입 제약을 만듭니다.

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

유니온 타입 제약에 ~ 를 빠뜨리면 기저 타입이 같은 커스텀 타입( type Celsius float64 )이 제외됩니다.