Ответ
Дженерики (обобщённое программирование) были добавлены в Go в версии 1.18. Они позволяют писать функции и типы, которые могут работать с любым типом из определённого набора, не дублируя код.
Синтаксис и основные концепции:
- Параметры типа (Type Parameters): Указываются в квадратных скобках после имени функции или типа. Например,
[T any]
. any
: Встроенный псевдоним дляinterface{}
, означает "любой тип".- Ограничения (Constraints): Это интерфейсы, которые определяют, какими свойствами должен обладать тип-параметр. Например, чтобы типы можно было сравнивать, используется ограничение
constraints.Ordered
.
Пример обобщённой функции:
import "golang.org/x/exp/constraints"
// Эта функция работает с любым типом, который поддерживает операции сравнения >, <, == и т.д.
func Max[T constraints.Ordered](a, b T) T {
if a > b {
return a
}
return b
}
// Использование:
maxInt := Max(5, 10) // int
maxFloat := Max(3.14, 1.618) // float64
maxString := Max("apple", "orange") // string
Основные области применения:
- Структуры данных: Написание обобщённых списков, стеков, очередей, деревьев.
- Алгоритмы: Функции для работы со слайсами (поиск, фильтрация, маппинг) без привязки к конкретному типу элементов.
- Утилиты: Функции, выполняющие общие операции, такие как
Max
,Min
.
Ограничения:
- Нет специализации шаблонов: В отличие от C++, нельзя предоставить отдельную реализацию функции для конкретного типа.
- Нет методов с параметрами-типами: Параметры-типы могут быть только у функций и типов, но не у методов.
- Стирание типов (Type Erasure): Во время выполнения информация о конкретных типах, использованных для инстанцирования дженерика, частично теряется, что ограничивает возможности рефлексии.