The Go Blog
Следующий шаг для дженериков
Введение
Прошло почти год с тех пор, как мы в последний раз писали о возможности добавления дженериков в Go. Пришло время обновления.
Обновлённый дизайн
Мы продолжали совершенствовать черновик дизайна дженериков. Мы написали типизатор: программу, которая может разбирать код на Go, использующий дженерики, как описано в черновике дизайна, и сообщать о любых ошибках типов. Мы написали примеры кода. И собрали обратную связь от многих, многих людей — спасибо за предоставленную!
На основе полученных знаний мы выпускаем обновлённый черновик дизайна. Наибольшее изменение заключается в том, что мы отказываемся от идеи контрактов. Разница между контрактами и типами интерфейсов была запутанной, поэтому мы устраняем эту разницу. Типовые параметры теперь ограничены типами интерфейсов. Типы интерфейсов теперь допускают включение списков типов, хотя только в том случае, если они используются как ограничения; в предыдущем черновике дизайна списки типов были функцией контрактов. Более сложные случаи будут использовать параметризованный тип интерфейса.
Мы надеемся, что люди найдут этот черновик дизайна проще и легче для понимания.
Инструмент для экспериментов
Чтобы помочь принять решение о дальнейшем совершенствовании черновика дизайна, мы выпускаем инструмент перевода. Это инструмент, который позволяет проверить типы и запустить код, написанный с использованием версии дженериков, описанной в черновике дизайна. Он работает путём перевода дженерического кода в обычный код на Go. Этот процесс перевода накладывает некоторые ограничения, но мы надеемся, что он будет достаточным для того, чтобы люди получили представление о том, как может выглядеть дженерический код на Go. Реализация дженериков, если они будут приняты в язык, будет работать иначе. (Мы только начали намечать, как могла бы выглядеть прямая реализация компилятора.)
Инструмент доступен в варианте Go playground по адресу https://go2goplay.golang.org. Этот playground работает так же, как обычный Go playground, но поддерживает дженерический код.
Также можно собрать и использовать инструмент самостоятельно.
Он доступен в ветке master репозитория Go.
Следуйте инструкциям по установке Go из исходников.
Там, где эти инструкции указывают на то, чтобы вы проверили последний тег релиза,
вместо этого выполните команду git checkout dev.go2go.
Затем соберите инструарий Go согласно указаниям.
Инструмент перевода документирован в README.go2go.
Следующие шаги
Мы надеемся, что этот инструмент предоставит сообществу Go возможность экспериментировать с дженериками. Есть два главных вопроса, на которые мы надеемся получить ответы.
Во-первых, имеет ли дженериковый код смысл? Ощущается ли он как Go? Какие сюрпризы встречают пользователи? Полезны ли сообщения об ошибках?
Во-вторых, мы знаем, что многие люди говорят, что Go нуждается в дженериках, но мы не всегда понимаем, что это значит. Отражает ли этот черновой дизайн проблему полезным способом? Если существует проблема, которая заставляет вас думать «Я мог бы решить её, если бы Go имел дженерики», можете ли вы решить проблему при использовании этого инструмента?
Мы будем использовать обратную связь, собранную от сообщества Go, чтобы принять решение о дальнейшем развитии. Если черновой дизайн будет хорошо принят и не потребует существенных изменений, следующим шагом станет формальное предложение изменения языка. Чтобы сформировать ожидания, если все будут полностью довольны черновым дизайном и он не требует дальнейших корректировок, самые ранние дженерики могут быть добавлены в Go в релизе Go 1.17, запланированном на август 2021 года. На самом деле, конечно, могут возникнуть непредвиденные проблемы, поэтому это оптимистичное времяпо́ляние; мы не можем дать никаких точных прогнозов.
Обратная связь
Лучший способ предоставить обратную связь по изменениям языка — это через
почтовую рассылку golang-nuts@googlegroups.com.
Почтовые рассылки несовершенны, но они кажутся нашим лучшим вариантом для начального обсуждения.
При написании писем о черновом дизайне, пожалуйста, помещайте [generics] в начале строки Темы и начинайте отдельные темы для разных конкретных вопросов.
Если вы обнаружите ошибки в типизаторе дженериков или в инструменте перевода,
они должны быть зарегистрированы в стандартном трекере проблем Go по адресу
go.dev/issue.
Пожалуйста, начинайте название задачи с cmd/go2go:.
Обратите внимание, что трекер проблем — не лучшее место для обсуждения изменений
языка, потому что он не поддерживает ветвление и не подходит для длинных диалогов.
Мы с нетерпением ждем вашей обратной связи.
Благодарности
Мы еще не закончили, но продвинулись далеко. Мы не были бы здесь без большой помощи.
Мы хотим поблагодарить Филипа Вадлера и его коллег за формальное рассмотрение дженериков в Go и помощь в уточнении теоретических аспектов дизайна. Их статья Featherweight Go анализирует дженерики в ограниченной версии Go, и они разработали прототип на GitHub.
Мы также хотим поблагодарить людей, которые предоставили подробную обратную связь по более ранней версии чернового дизайна.
И, наконец, но определённо не последнее, мы хотели бы поблагодарить множество людей из команды Go, многих участников трекера проблем Go и всех остальных, кто делился идеями и обратной связью по ранним проектам дизайна. Вы прочитали всё это, и мы благодарны вам. Мы не были бы здесь без вас.
Следующая статья: Keeping Your Modules Compatible
Предыдущая статья: Pkg.go.dev is open source!
Blog Index