Go 2
Проект черновика для дженериков представлен на https://blog.golang.org/go2draft.
Go 1
Расс Кокс, один из ветеранов Go, написал в блоге сообщение под названием «Общая дилемма », в котором он спрашивает
… вам нужны медленные программисты, медленные компиляторы и раздутые двоичные файлы или медленное время выполнения?
Медленные программисты, являющиеся результатом отсутствия дженериков, медленные компиляторы вызваны C ++, такими как дженерики, и медленное время выполнения проистекает из подхода упаковки-распаковки, который используется Java.
Четвертая возможность, не упомянутая в блоге, идет по маршруту C #. Генерация специализированного кода, как в C ++, но во время выполнения, когда это необходимо. Мне действительно это нравится, но Go очень не похож на C #, так что это, вероятно, вообще не применимо ...
Я должен упомянуть, что при использовании популярной Java 1.4-подобной техники универсального программирования в go , приводящей к interface{}
, возникают те же проблемы, что и при распаковке (потому что это то, что мы делаем), кроме потери времени компиляции типа безопасности. Для небольших типов (например, ints) Go оптимизирует тип interface{}
так, чтобы список целых чисел, приведенных к интерфейсу {}, занимал непрерывную область памяти и занимал только вдвое больше места, чем обычные целые. Однако при приведении из interface{}
все еще существуют накладные расходы на проверки во время выполнения. Ссылка .
Все проекты, в которых добавлена общая поддержка go (их несколько, и все они интересны), одинаково проходят путь генерации кода времени компиляции на C ++.