Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Антон Кильчик – Дженерики, которые мы заслужили

Антон Кильчик – Дженерики, которые мы заслужили

Avatar for GolangMoscow

GolangMoscow

August 29, 2019
Tweet

More Decks by GolangMoscow

Other Decks in Programming

Transcript

  1. 2

  2. Нужны ли дженерики в Go? Нужны! 4 Обобщенные алгоритмы 

    Найти наибольшее значение в слайсе  Найти кратчайший путь в графе Функции высшего порядка  map  reduce  filter
  3. Нужны ли дженерики Go? Нужны! 5 Задачи, связанные с организацией

    конкуррентности  Вызвать множество функций параллельно и получить список результатов  Читать из канала до таймаута Обобщенные структуры данных  Sets  Trees  Потокобезопасные структуры данных
  4. Путь Go 1. Копипаст 9 Недостатки  Не DRY 

    Долго  Способствует ошибкам
  5. Путь Go 1. Интерфейсы 10 Недостатки  Доп память 

    Медленно  Пачка методов для каждого типа
  6. Путь Go 1. Type assertions 11 Недостатки  Медленно 

    Нет проверок типов  Кастование делает пользователь
  7. Путь Go 1. Кодогенерация 12 cat source.go | genny gen

    "Something=string" Недостатки  Доп шаг при сборке
  8. Путь C++. Мономорфизация 15 Плюсы:  Не сказываются на производительности

    Минусы:  Медленная компиляция  Увеличение бинарника
  9. Путь Java. Type erasure 18 Плюсы:  Одна версия для

    всех типов Минусы:  Приведение типов сказывается на производительности
  10. Путь Go 2. Ограничения 19  Минимум новых ключевых слов

     Добавление дженериков не должно добавлять сложности пользователю  И быстрая компиляция и быстрый рантайм  Go должен оставаться Go  Информация о типах и в рантайме и при компиляции
  11. Драфт. Внутри 22 В отличие от C++ :  Есть

    концепция контрактов  Есть type inference  Нет специализаций  Нет возможности метапрограммирования  Нет variadic templates  Из функций будет генериться одна версия для всех типов В отличие от Java :  Нет type erasure  Нет covariance / contravariance  Из типов будут генериться несколько версий для каждого типа
  12. Эволюция контрактов. Что такое контракт 25 Без контракта можно 

    Объявлять переменные обобщенного типа  Присваивать им значения того же типа  Передавать их в функции или возвращать из функций  Брать адрес  Создавать слайсы/мапы
  13. Итого. Когда можно пощупать 30  Прямо сейчас можно наблюдать

    за имплементацией (https://go- review.googlesource.com/c/go/+/187317)  Возможно завезут в Go 1.15, работа над которым начнется в ноябре
  14. Итого. Достоинства и недостатки 31 Достоинства  Вывод типов 

    Всего 1 новый keyword  Попытка вобрать лучшее из Java и C++  Контракты интуитивны  Возможность появления пакетов slices, maps, chans, set
  15. Итого. Достоинства и недостатки 32 Недостатки  Обилие скобочек 

    Усложнение языка  Все еще нельзя пощупать
  16. Ссылки 33  Summary of Go Generics Discussions  Статья,

    посвященная последней версии драфта  https://go.googlesource.com/proposal/+/master/design/go2draft-generics- overview.md  Имплементация поддержки контрактов (в процессе)