Generics появились в Go 1.18 и позволяют писать функции и типы, параметризованные типами. Раньше приходилось использовать interface{} и терять типобезопасность, теперь компилятор сам всё проверяет.
func Filter[T any](s []T, f func(T) bool) []T {
var result []T
for _, v := range s {
if f(v) {
result = append(result, v)
}
}
return result
}
Можно задавать ограничения (constraints) через интерфейсы: [T comparable], [T constraints.Ordered]. Ограничение: нельзя параметризовать методы — только функции и типы. На практике дженерики используются в пакетах slices, maps и для написания утилитарных функций.