Что такое generics в Go?

Middle
1.6k просмотров
AFK Offer AI

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/constraintsOrdered, Integer, Float и т.д.
Generics хороши для контейнеров, утилит, алгоритмов. Не усложняй ими бизнес-логику.

Следующий вопрос

Как обрабатывать ошибки в горутинах?