Go: Дженерики
Теория: Обобщённые структуры и методы
Когда речь заходит о дженериках, важно понимать, что они применимы не только к функциям, но и к структурам. В реальных задачах часто требуется контейнер, который может хранить данные разных типов, но при этом оставаться строго типизированным. Для этого в Go можно объявить обобщённую структуру. Синтаксис похож на функции: после имени структуры указывается параметр типа.
Здесь Box — это контейнер, который может хранить значение любого типа. Если создать Box[int], внутри окажется число, а если Box[string] — строка. Такой подход избавляет от необходимости использовать пустой интерфейс и делать ручное приведение типов.
Структуры могут иметь методы, которые тоже используют параметры типа. Например, у коробки можно добавить методы для установки и получения значения:
Эти методы сохраняют строгую типизацию: Box[int] принимает и возвращает только числа, а Box[string] — только строки. Попытка смешать типы приведёт к ошибке компиляции.
Иногда нужно работать сразу с несколькими типами. В таком случае объявляют несколько параметров. Например, пара ключ-значение:
Такая структура позволяет строить словари, кэш или ассоциированные данные, где один параметр отвечает за тип ключа, а другой — за тип значения.
Хороший пример обобщённой структуры — стек. Он хранит элементы в срезе и предоставляет методы для добавления и извлечения:
Такой стек можно использовать с любым типом:
Те же принципы можно применить для очереди, дерева или связанного списка. Например, очередь:
Обобщённые структуры и методы делают код гибким и переиспользуемым. Вместо десятков реализаций для разных типов достаточно описать один универсальный вариант. Go сохраняет строгую проверку на этапе компиляции, поэтому контейнеры и коллекции на дженериках получаются безопасными и удобными.



