Go 1.22 제네릭 타입 추론 개선 사항 정리
배경
Go 1.18에서 제네릭이 도입된 이후 실무에서 활용하고 있었는데, 타입 추론이 예상대로 동작하지 않아 명시적으로 타입을 지정해야 하는 경우가 많았다. Go 1.22에서 이 부분이 개선되었다는 소식에 테스트해봤다.
주요 개선 사항
1. 함수 인자에서의 타입 추론
기존에는 제네릭 함수를 다른 제네릭 함수의 인자로 전달할 때 타입 추론이 실패했다.
func Map[T, U any](slice []T, fn func(T) U) []U {
result := make([]U, len(slice))
for i, v := range slice {
result[i] = fn(v)
}
return result
}
func Transform[T any](v T) string {
return fmt.Sprintf("%v", v)
}
// Go 1.21: 컴파일 에러
// Go 1.22: 정상 동작
result := Map([]int{1, 2, 3}, Transform)
1.21에서는 Transform[int]처럼 명시해야 했는데, 1.22부터는 타입 추론이 동작한다.
2. 인터페이스 제약에서의 타입 매칭
복합 타입 제약 조건에서도 추론이 개선되었다.
type Numeric interface {
~int | ~int64 | ~float64
}
func Sum[T Numeric](values []T) T {
var sum T
for _, v := range values {
sum += v
}
return sum
}
type CustomInt int
// Go 1.22에서 정상 추론
var vals []CustomInt = []CustomInt{1, 2, 3}
result := Sum(vals) // T가 CustomInt로 추론됨
실무 적용
사내 유틸리티 라이브러리에서 제네릭 헬퍼 함수들의 타입 명시를 대부분 제거할 수 있었다. 특히 슬라이스 변환, 필터링 로직에서 코드가 간결해졌다.
다만 여전히 복잡한 중첩 제네릭 구조에서는 명시적 타입 지정이 필요한 경우가 있다. 컴파일러 에러 메시지는 여전히 개선의 여지가 있다.
참고
- Go 1.22 Release Notes
- Type Inference in Go 1.22 proposal