Дженерики это круто! Почему бы не попробовать пример

Универсальное программирование позволяет представлять функции и структуры данных в универсальной форме без учета типов.

Что это значит?

Этот пост использует пример, чтобы показать, почему и как использовать дженерики в 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.

Ресурсы