О чем этот материал
Параметризованные типы, ограничения, примеры и практический взгляд на generics в Go.
Это адаптированная версия учебной презентации: слайды разобраны в формате обычной статьи, чтобы материал было легче читать с телефона и возвращаться к нужным блокам позже.
Generics in Go
Введение в дженерики
- Что такое дженерики?
- Параметризованные типы
- Позволяют писать переиспользуемый код
- Почему дженерики важны?
- Сокращение кода
- Безопасность типов
Дженерики в Go
сутки после первого релиза Go (11 Ноября 2009г)
Пример:
func Identity[T any](value T) T { return value }
- Комментарий с просьбой о дженериках появился менее чем через
- Введены в Go 1.18
- Контракты определяют поведение дженерик-типов
- Синтаксис:
Плюсы
Generic-программирование оперирует функциями и структурами в обобщённой форме.
- Позволяют нам типизировать методы, функции и структуры наборами типов
- Позволяют создавать более универсальные (общие) функции
- Позволяют “запрещать” использование каких-то определенных интерфейсов
- Позволяют создавать универсальные коллекции
- Позволяют писать переиспользуемый код
Минусы
- Увеличение сложности (может быть)
- Потенциальные накладные расходы на производительность
Особенности реализации в Go
параметров, используемых в обобщенном коде
(как в fmt.Println())
- Ограничения типов
- Предопределенные: any, comparable
- Пользовательские: контракты
- Компилятор Go может автоматически определить типы аргументов и
Синтаксис
Примеры: Универсальная функция Swap
Примеры: Универсальный стек
Примеры: Универсальная функция Map
Примеры: Универсальная функция Filter
Примеры: Универсальный интерфейс Sort
Заключение
избежание boilerplate
преимуществ и сложности
- Дженерики улучшают переиспользуемость кода,
- Реализация Go предоставляет ограничения типов
- Дженерики следует использовать разумно, с учетом