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