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) {}
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 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 {
...
}