Go является одним из широко используемых языков для создания микросервисов и веб-приложений. Большинство проектов сейчас переводят свою кодовую базу на golang. Функции, предоставляемые go в стандартной библиотеке, простота использования и быстрое выполнение на многопроцессорной системе являются причиной растущего спроса на него.

Хотя программисты пришли из таких языков, как python, java, которые предоставляют множество динамических функций для работы со структурами данных, которые можно легко использовать для изменения и обработки структур данных, таких как push, pop и т. д. В то время как в golang вы должны использовать базовые структуры данных с линейные функции (как в циклах) для изменения или работы с ними, например, работа с очередями, стеками.

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

Одна из наиболее распространенных возможностей использования дженериков для работы с различными типами данных представлена ​​в новом обновлении go 1.18. Поскольку golang является статическим языком, он не может предоставить динамический тип данных, который может поддерживать несколько типов. Например, есть функции max и min, предоставляемые python, которые используются для поиска минимального числа в массиве или для поиска минимума двух объектов или чисел. В то время как в случае с golang нам нужно создать две отдельные функции для каждого примитивного типа (int или string). Хотя есть способ, которым мы можем использовать интерфейс в качестве универсального типа, но при работе с интерфейсом нам все равно нужно извлечь базовый примитивный тип для выполнения выполнения, что опять же не является универсальным способом делать что-то.

В go 1.18 введены некоторые новые функции, которые постоянно запрашиваются пользователями go, одна из которых представляет дженерики. Обобщения, представленные в Go, не похожи на Python или любой другой язык, но обещают ту же функциональность. Мы можем использовать тип any для объявления типа в функции вместе с его аргументами и предоставления метатипа типа в методе, а затем использовать его для нескольких примитивных типов. Они называются ограничениями типа, которые объявляются с помощью функции перед аргументами.

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

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

Мы можем объявить тип как тип any, чтобы создать общий метод, который может принимать как целое число, так и строку, чтобы инвертировать их соответственно. Это будет создано путем объявления метатипа типа any, который будет иметь тип значения как целого числа, так и строки.

В приведенном выше примере мы видим, что мы используем единую общую функцию, определяющую метатип типа any, который используется для принятия любого типа, такого как интерфейс. Это можно использовать для создания универсальной функции, обеспечивающей аналогичную функциональность для нескольких типов.

Ограничение типа позволяет нам объявить тип вместе с аргументами функции, которые можно использовать для размещения нескольких типов, определенных во время объявления ограничения. Например:- func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V)

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

type Number interface {
    int64 | float64
}

После объявления вы можете вызвать функцию либо с определением типов, ожидаемых объявленным типом ограничения функции, либо вы можете пропустить аргументы типа (имена типов в квадратных скобках) при вызовах универсальной функции. Компилятор Go может вывести аргумент типа из других аргументов.

SumIntsOrFloats[string, int64](ints), ==> generic function call
SumIntsOrFloats[string, float64](floats))
or
SumIntsOrFloats(ints), ==> generic function call
SumIntsOrFloats(floats))

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

  • Найти самый маленький/самый большой элемент в срезе
  • Найти среднее/стандартное отклонение среза
  • Вычислить объединение/пересечение карт
  • Найти кратчайший путь в графе узлов/ребер
  • Применить функцию преобразования к срезу/карте, возвращая новый срез/карту

Как связаться с: - напишите по адресу : [email protected] в случае любых связанных вопросов.

Ставьте 👏, если вам понравилась статья. Подпишитесь на Himanshu Chaudhary, чтобы узнать больше статей об облаке и облачных технологиях. Спасибо, читатели. 🙂

Ссылка на ссылочный документ: -