GO · 함수
제네릭 함수 & 타입 제약
Go 1.18+의 제네릭은 타입 파라미터로 코드 재사용성을 높입니다. constraints 패키지의 인터페이스로 타입을 제약하고, ~ 틸드로 기반 타입(underlying type)까지 허용할 수 있습니다.
함수중급genericstype-constraintstype-parametersgo118
핵심 설명
Go 1.18+의 제네릭은 타입 파라미터로 코드 재사용성을 높입니다. constraints 패키지의 인터페이스로 타입을 제약하고, ~ 틸드로 기반 타입(underlying type)까지 허용할 수 있습니다.
Go code
package main
import (
"cmp"
"fmt"
"golang.org/x/exp/constraints"
)
// 1. 기본 제네릭 함수
func Map[T any, 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 Filter[T any](slice []T, pred func(T) bool) []T {
var result []T
for _, v := range slice {
if pred(v) {
result = append(result, v)
}
}
return result
}
// 2. 타입 제약 인터페이스
type Number interface {
~int | ~int64 | ~float64
}
func Sum[T Number](nums []T) T {
var total T
for _, n := range nums {
total += n
}
return total
}
// 3. 커스텀 타입도 ~ 틸드로 허용
type Score int
// 4. 제네릭 구조체
type Pair[T, U any] struct {
First T
Second U
}
func NewPair[T, U any](first T, second U) Pair[T, U] {
return Pair[T, U]{First: first, Second: second}
}
// 5. cmp.Ordered 활용 (Go 1.21+)
func MaxOf[T cmp.Ordered](a, b T) T {
if a > b {
return a
}
return b
}
func main() {
// Map & Filter
nums := []int{1, 2, 3, 4, 5}
doubled := Map(nums, func(n int) int { return n * 2 })
evens := Filter(nums, func(n int) bool { return n%2 == 0 })
fmt.Println("2배:", doubled) // [2 4 6 8 10]
fmt.Println("짝수:", evens) // [2 4]
// Number 제약
scores := []Score{85, 92, 78, 95}
fmt.Println("점수 합:", Sum(scores)) // Score 타입도 OK
// 제네릭 Pair
pair := NewPair("이름", 42)
fmt.Printf("Pair: %s=%d\n", pair.First, pair.Second)
// MaxOf
fmt.Println("최댓값:", MaxOf(3.14, 2.71))
}학습 팁
any는 interface{}의 별칭이며, comparable은 == 연산이 가능한 타입을 의미합니다. 가능하면 cmp.Ordered 같은 표준 제약을 활용하세요.
주의할 점
제네릭 타입 파라미터에 ~int 틸드를 빼면 커스텀 타입(type Score int)이 제약을 만족하지 못합니다. 기반 타입을 허용하려면 반드시 ~를 사용하세요.
자주 묻는 질문
제네릭 함수 & 타입 제약란 무엇인가요?
Go 1.18+의 제네릭은 타입 파라미터로 코드 재사용성을 높입니다. constraints 패키지의 인터페이스로 타입을 제약하고, ~ 틸드로 기반 타입(underlying type)까지 허용할 수 있습니다.
제네릭 함수 & 타입 제약 학습 시 주의할 점은 무엇인가요?
제네릭 타입 파라미터에 ~int 틸드를 빼면 커스텀 타입( type Score int )이 제약을 만족하지 못합니다. 기반 타입을 허용하려면 반드시 ~ 를 사용하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.