Go - Generic

함수 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에서 확인할 수 있다.