Generics (Go 1.18+) — параметризация типов. Позволяет писать функции и типы, работающие с разными типами без interface{} и reflect.
func Map[T any, R any](items []T, fn func(T) R) []R {
result := make([]R, len(items))
for i, v := range items {
result[i] = fn(v)
}
return result
}
names := Map(users, func(u User) string { return u.Name })
Type constraints — ограничения на тип:
type Number interface {
~int | ~int64 | ~float64 // ~ включает типы на основе (type MyInt int)
}
func Sum[T Number](nums []T) T {
var total T
for _, n := range nums {
total += n
}
return total
}
Встроенные constraints:
any— любой тип (алиас дляinterface{})comparable— типы, поддерживающие==и!=golang.org/x/exp/constraints—Ordered,Integer,Floatи т.д.