Generics

chris·2023년 2월 4일
0

golang

목록 보기
8/8
post-thumbnail

Go는 v1.18부터 새롭게 Generic이 도입되었다.

기본 사용방법

package main

import "fmt"

func main() {
	printArgument(1)
	printArgument(1.0)
	printArgument("1")
}

func printArgument[T any](a T) {
	fmt.Println(a)
}

Go에서는 대부분의 Generic을 지원하는 언어와 비슷하게 Generic function을 정의한다.
func function-name[T constraint](param T) {}

Type constraint

func printArgument[T any](a T) {
	fmt.Println(a)
}

위 코드에서 T는 type parameter이고 any는 type constraint이다. any는 모든 타입이 가능하다는 뜻이다.
Println과 같이 모든 타입을 파라미터로 사용할 수 있는 함수이면 any type constraint를 사용해도 문제가 되지 않지만 다음과 같은 함수에서는 any를 사용하면 에러가 발생한다.

func min[T any](x, y T) T {
	if x < y {
    	return x
    }
    return y
}

// invalid operation: x > y (type parameter T is not comparable with >)

any를 사용할 경우 해당 함수는 int, float32 등 >연산자를 지원하는 타입 뿐 아니라 interface{}와 같은 >연산자를 지원하지 않는 타입도 처리가 가능해야 하기 때문에 위와 같은 에러가 발생한다.
이때 우리는 any대신 다음과 같이 지원예정 타입을 나열하는 방식을 선택할 수 있다.

func min[T int | int16 | int32 | int64 | float32 | float64](x, y T) T {
	if x < y {
    	return x
    }
    return y
}

Type constraint 정의

type Numeric interface {
	int | int16 | int32 | int64 | float32 | float64
}
func min[T Numeric](x, y T) T {
	...
}

위와 같이 Type constraint를 정의해서 다양하게 사용할 수 있지만 미리 정의된 constraints package를 import해서 사용하는 것도 가능하다.

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

func min[T constraints.Integer | constraints.Float](x, y T) T {
	...
}
profile
software engineer

0개의 댓글