Что такое дженерики в Go? Как ограничить набор типов (constraints)?
Answer from AI
sobes.tech AI
Дженерики в Go позволяют писать обобщённый код, который работает с разными типами данных, сохраняя при этом типобезопасность.
Ограничения (constraints) — это интерфейсы, которые задают набор требований к типам, которые можно использовать в параметрах дженериков. Они позволяют ограничить допустимые типы, например, только числовые или только типы, реализующие определённый интерфейс.
Пример ограничения с использованием встроенного интерфейса constraints.Ordered (из пакета golang.org/x/exp/constraints), который включает все упорядочиваемые типы:
import "golang.org/x/exp/constraints"
func Min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
Здесь функция Min принимает два параметра типа T, где T ограничен типами, поддерживающими оператор <.
Можно также создавать свои собственные ограничения:
type Number interface {
~int | ~int64 | ~float64
}
func Sum[T Number](a, b T) T {
return a + b
}
Здесь Number — пользовательский constraint, который разрешает только указанные числовые типы (символ ~ означает, что допускаются типы с базовым типом из перечисленных).
Таким образом, дженерики и constraints позволяют писать гибкий и безопасный код, ограничивая набор допустимых типов для параметров функций и структур.