핵심 요약
Go 1.23 generic types 안정 6개월. 사내 12개 라이브러리에 generic 적용. interface{} + 캐스팅 패턴 사라짐, 코드 중복 -52%, 컴파일 시간 +14%(받아들일 수준).
1. 1.23 generic 핵심 — Type Parameters
// Before — interface{}
func MapAny(s []interface{}, f func(interface{}) interface{}) []interface{} {
r := make([]interface{}, len(s))
for i, v := range s { r[i] = f(v) }
return r
}
// 1.23 — generic
func Map[T, U any](s []T, f func(T) U) []U {
r := make([]U, len(s))
for i, v := range s { r[i] = f(v) }
return r
}
ints := Map([]int{1, 2, 3}, func(n int) string { return strconv.Itoa(n) })
2. constraints — 자주 쓰는 패턴
import "golang.org/x/exp/constraints"
func Max[T constraints.Ordered](a, b T) T {
if a > b { return a }
return b
}
Max(3, 5) // int
Max("hi", "bye") // string
3. range over function — 1.23 새 기능
func Keys[K comparable, V any](m map[K]V) func(yield func(K) bool) {
return func(yield func(K) bool) {
for k := range m {
if !yield(k) { return }
}
}
}
for k := range Keys(myMap) { fmt.Println(k) }
4. 데이터 — 12 라이브러리
| 지표 | Before | After |
|---|---|---|
| 총 LoC | 28,400 | 13,700 |
| 타입 단언 panic | 월 ~6건 | 0 |
| 빌드 시간 | 14s | 16s |
| 바이너리 크기 | 8.2MB | 8.8MB |
5. 함정
- Generic 메서드 미지원 — type parameter는 func에만, struct method는 안 됨. 우회는 generic struct + 일반 method
- Type inference — 일부 케이스 추론 실패, 명시 type 인자 [int] 필요
- Constraint 작성 — interface 정의 학습, golang.org/x/exp/constraints 활용
- 에러 메시지 — generic 관련 컴파일 에러 메시지 종종 헷갈림, 1.24에서 개선 예정

댓글 0