함수 Generic
Go도 1.18 버전부터 Generic을 지원하기 시작했다.
func 함수명[T any](n T) T {...}
함수명 뒤에 [ ]를 통해 제너릭을 선언할 수 있다.
any는 모든 타입을 뜻하며, comparable은 ==, != 비교가 가능한 타입을 의미한다. 그 외 정의된 타입의 키워드(string, int...)들을 사용할 수 있다.
func Power[T int | float64](n T) T {
return n * n
}
|(OR)을 이용해 여러 타입을 작성할 수 있다.
type Number interface {
int | int16 | int32 | int64 | float32 | float64
}
func Power[T Number](n T) T {
return n * n
}
타입이 늘어날 경우, interface를 선언해 여러 타입을 하나의 이름으로 묶어 사용할 수 있다.
객체 Generic
객체를 생성할 때도 객체명 뒤에 제너릭을 통해 타입을 제한해 준다.
type Sample[T any] struct {
item T
}
func NewSample[T any](newItem T) *Sample[T] {
sample := Sample[T]{newItem}
return &sample
}
func (sample *Sample[T]) PrintItem() {
fmt.Print(sample.item)
}
제너릭이 적용된 객체는 객체[타입]의 형태로 사용된다. 객체를 생성하거나 메서드를 선언할 때에도 동일하게 객체[ ] 형식으로 사용한다.
contraints
수치 연산이 가능한 타입이나, 대소비교가 가능한 타입 등 일반적으로 많이 사용되는 타입을 인터페이스로 정의해 둔 패키지가 있다. 하지만 글을 쓰는 시점을 기준으로 아직 정식 버전에 포함되어 있지는 않다.
자세한 내용은 golang.org/x/exp/constraints에서 확인할 수 있다.