Дженерики это круто! Почему бы не попробовать пример
Универсальное программирование позволяет представлять функции и структуры данных в универсальной форме без учета типов.
Что это значит?
Этот пост использует пример, чтобы показать, почему и как использовать дженерики в Go.
Минимальная проблема
Учитывая серию значений, все типы которых являются целыми числами (с плавающей запятой или строкой), верните минимальное/максимальное значение.
До Go1.18 было очень неудобно решать эту проблему, потому что приходилось определять отдельные функции min/max для разных типов.
К счастью! С новым принятым предложением в Go 1.18, наконец, мы можем упростить себе жизнь, используя дженерики.
Обзор общих понятий
- Функции могут иметь дополнительный список параметров типа, который использует квадратные скобки, но в остальном выглядит как обычный список параметров:
func Function[T any](p T) { ... }
. - Эти параметры типа могут использоваться обычными параметрами и телом функции.
- Типы также могут иметь список параметров типа:
type M[T any] []T
. - Каждый параметр типа имеет ограничение типа, точно так же, как каждый обычный параметр имеет тип:
func Function[T Constraint](p T) { ... }
. - Ограничения типа — это типы интерфейса.
- Новое предварительно объявленное имя
any
является ограничением типа, допускающим любой тип. - Универсальные функции могут использовать только операции, поддерживаемые всеми типами, разрешенными ограничением.
- Использование универсальной функции или типа требует передачи аргументов типа.
- Вывод типа позволяет опускать аргументы типа при вызове функции в общих случаях.
Пример объявления универсальной функции
Пояснения
строка № 6
Пакет constraints
определяет набор полезных ограничений для использования с параметрами типа.
строка № 9
TheOrdered
— это ограничение, разрешающее любой упорядоченный тип, поддерживающий операторы ‹ ‹= ›= ›, такие как int
float
string
Параметр args
называется параметром с переменным числом аргументов, поскольку его можно вызывать с любым количеством завершающих аргументов типа T.
Помните, что тип вариационного параметра — []T в реализации функции; однако тип вариационного параметра - ...T в объявлении функции.
Общее функциональное тестирование
Проверить приведенный выше код очень просто; вам нужно запустить код.
go test -v
Надеюсь, вам понравилось это читать 😄. Если вы хотите поддержать меня ☕ как писателя, рассмотрите возможность подписки стать участником Medium. Вы также получите неограниченный доступ ко всем историям на Medium.