Презентация

Дженерики в Go: где помогают, а где только мешают

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

О чем этот материал

Параметризованные типы, ограничения, примеры и практический взгляд на 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 предоставляет ограничения типов
  • Дженерики следует использовать разумно, с учетом