go version 1.18λΆν° generic μΆκ°λμ΄ κ΄λ ¨ν΄μ κΈ°λ‘π
- νμ νλΌλ―Έν°λ₯Ό ν΅ν΄ νλμ ν¨μλ νμ μ΄ μ¬λ¬ νμ λ€μ λν΄ λμ κ°λ₯νλλ‘ μ½λ μ¬μ¬μ©μ±μ λ리λ κΈ°λ²
- νμ νλΌλ―Έν°λ₯Ό ν΅ν΄ νλμ ν¨μ/νμ μ΄ μ¬λ¬ νμ μ μ§μν΄μΌλλ ν¨μμμ λμν μ μλλ‘ ν΄μ€
- 'νμ μ νμ'λ₯Ό μ΄μ©ν΄ νμ νλΌλ―Έν°λ‘ μ¬μ©λλ νμ μ ν κ°λ₯
- μΈν°νμ΄μ€λ νμ μ νμλ‘ μ¬μ© κ°λ₯
- νλμ μ½λλ‘ μ¬λ¬ νμ μ λν΄ μ¬μ¬μ© κ°λ₯
-
λ€μ μλμ λν΄ μ λ€λ¦μ μ μ©ν μ μμ
- ν¨μ
- νμ μ νμ (https://pkg.go.dev/golang.org/x/exp/constraints)
- μ λ€λ¦ νμ (ꡬ쑰체)
-
μλ£κ΅¬μ‘°(μ¬λΌμ΄μ€, 맡, μ±λ λ±)κ³Ό κ°μ΄ 컨ν μ΄λ νμ μ μ¬μ©ν λ μ μ©
-
λ€μν νμ μ λν΄ λΉμ·ν λμμ ν΄μΌνλ κ²½μ° μ μ©
-
μμ 1) Add() ν¨μ
// μ μνμ λν λ§μ μ μννλ ν¨μ func Add(a, b int) int { return a + b } // μ€μνμ λν λ§μ μ μννλ ν¨μ func Add(a, b float32) float32 { return a + b }
import "constraints" // μ λ€λ¦μ μ¬μ©νμ¬, μ μ/μ€μμ λν΄ λ§μ μ μννλ ν¨μ func add[T constraints.Integer | constraints.Float](a, b T) T { return a + b }
[T constraint] : νμ νλΌλ―Έν°λ₯Ό λνλ
-
μμ 2) Print() ν¨μ
// λͺ¨λ νμ μ λν΄ μΆλ ₯νλ ν¨μ func Print[T1 any, T2 any](a T1, b T2) { fmt.Println(a, b) }
[T any] : λͺ¨λ νμ μ΄ κ°λ₯νλ€κ³ νμν νμ νλΌλ―Έν°
-
μμ 3) νμ μ νμ΄ μλ Add() ν¨μ
// νμ μ ν μ μΈ type Integer interface { int8 | int16 | int32 | int64 | int } func add[T Integer](a, b T) T { return a + b }
add[T any]λ‘ μ€ν μ, ν΄λΉ νμ μ΄ + μ°μ°μκ° μ§μλλμ§ μ μ μμ΄ μλ¬κ° λ°μν¨
λ°λΌμ, λ°λ‘ νμ μ νμ μ μνμ¬ μ²λ¦¬ν μ μμ -
μμ 4) νμ μ νμ΄ μλ Add() ν¨μ - λ³μΉ νμ κΉμ§ ν¬ν¨νλ κ²½μ°
// νμ μ ν μ μΈ( ~ : λ³μΉ νμ κΉμ§ ν¬ν¨) type Integer interface { ~int8 | ~int16 | ~int32 | ~int64 | ~int } type MyIntType int //λ³μΉ νμ μ μ func add[T Integer](a, b T) T { return a + b }
~λ₯Ό ν΅ν΄ λ³μΉνμ κΉμ§ ν¬ν¨νμ¬ νμ μ νμ΄ κ°λ₯