С Go 1.18 появились дженерики (generics). До этого использовали interface{}, кодогенерацию и copy-paste.
Основные конструкции:
func Map[T any, R any](s []T, f func(T) R) []R {
result := make([]R, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
Можно задавать constraints через интерфейсы:
type Number interface {
int | float64 | int64
}
func Sum[T Number](nums []T) T { ... }
Пакет constraints и slices/maps из стандартной библиотеки уже используют дженерики. Ограничение: нельзя параметризовать методы, только функции и типы.