Выпуск gopls v0.16.0
<code>go install golang.org/x/tools/gopls@v0.16.2 </code>
В этом выпуске представлены несколько новых функций и исправлений ошибок, а также это первый выпуск gopls, поддерживающий Go 1.23. Для установки выполните следующую команду:
Новая политика поддержки; завершение поддержки Go 1.19 и Go 1.20
TL;DR: Мы сокращаем окно поддержки gopls, однако это, скорее всего, не повлияет на вас, если вы используете как минимум Go 1.21 для сборки gopls. Это не влияет на поддержку gopls для кода, который вы пишете.
Это последний выпуск gopls, который можно собрать с использованием Go 1.19 или Go 1.20, а также последний, поддерживающий интеграцию с версиями команды go 1.19 и 1.20. Если gopls будет собран или использован с одной из этих версий Go, он отобразит сообщение с рекомендацией обновиться.
При использовании gopls существует три версии, о которых следует знать:
- Версия Go, использованная для сборки gopls: версия Go, использованная для сборки gopls.
- Версия команды go: версия команды go list, выполняемой gopls для загрузки информации о вашем рабочем пространстве.
- Языковая версия: версия в директиве go текущего файла, содержащегося в go.mod файле, которая определяет семантику языка Go для этого файла.
Этот выпуск gopls, v0.16.0, является последним, поддерживающим Go 1.19 и Go 1.20 как версию Go, использованную для сборки gopls, или версию команды go. Не происходит никаких изменений в поддержке всех языковых версий – на самом деле, эта поддержка несколько улучшена благодаря добавлению анализатора stdversion (см. ниже).
Начиная с gopls@v0.17.0, который будет выпущен после выхода Go 1.23.0 в августе, gopls будет поддерживать только последнюю версию Go как версию Go, использованную для сборки gopls.
Однако, благодаря обратной совместимости, добавленной в Go 1.21, любое необходимое обновление toolchain должно обрабатываться автоматически для пользователей Go 1.21 или более поздних версий, так же, как и любая другая зависимость.
Кроме того, мы сокращаем окно поддержки версии команды go с 4 версий до 3. Обратите внимание, что это означает, что если у вас установлена как минимум Go 1.21, вы всё ещё сможете выполнить go install и использовать gopls@v0.17.0.
У нас нет планов изменять поддержку языковых версий в будущем: мы ожидаем, что gopls всегда будет поддерживать разработку программ, ориентированных на любую версию Go.
Фокусируясь на сборке gopls с использованием последней версии Go, мы можем значительно сократить нагрузку на сопровождение и помочь улучшить стабильность будущих выпусков gopls. См. обновлённую политику поддержки для получения дополнительных сведений. Пожалуйста, оставьте комментарий в golang/go#65917, если у вас есть замечания по данному изменению.
Изменения конфигурации
- Экспериментальная настройка
allowImplicitNetworkAccessустарела (но ещё не удалена). Пожалуйста, оставьте комментарий в golang/go#66861, если вы используете эту настройку и она может быть затронута её удалением.
Новые возможности
Поддержка Go 1.23
Эта версия gopls — первая, поддерживающая новые языковые возможности Go 1.23,
включая
range-over-func итераторы
и поддержку
директивы godebug
в go.mod файлах.
Интегрированный просмотрщик документации
Gopls теперь предлагает код-действие «Просмотр документации», которое открывает локальную веб-страницу с отображением сгенерированной документации для Go пакетов и символов в формате, похожем на https://pkg.go.dev. Пакет или символ выбираются на основе текущего выделения.
Используйте эту функцию для предварительного просмотра размеченной документации при подготовке изменений API, или для чтения документации для локально отредактированных пакетов, даже тех, которые ещё не были сохранены. Перезагрузите страницу после редактирования, чтобы увидеть обновлённую документацию.
Как и в pkg.go.dev, заголовок каждого символа содержит ссылку на
исходный код его объявления. В pkg.go.dev такие ссылки ведут
на страницу исходного кода на сайтах, таких как GitHub или Google Code Search.
Однако в внутреннем просмотрщике gopls нажатие на одну из таких ссылок
приведёт к переходу в редактор к объявлению.
(Эта функция требует, чтобы ваш клиент LSP уважал downcall showDocument.)
Поддержка редакторов:
- VS Code: используйте пункт меню «Source action > Browse documentation for func fmt.Println». Примечание: ссылки на исходники перемещают редактор, но ещё не поднимают окно. Пожалуйста, проголосуйте за microsoft/vscode#208093 и microsoft/vscode#207634 (временно закрыто).
- Emacs: требуется eglot v1.17. Используйте
M-x go-browse-docиз github.com/dominikh/go-mode.el.
Настройка linksInHover теперь поддерживает новое значение "gopls",
которое заставляет ссылки на документацию в Markdown-выводе операции Hover
ссылаться на внутренний просмотрщик документации gopls.
Просмотр свободных символов
Gopls предлагает ещё одно веб-основанное код-действие, «Browse free symbols», которое отображает свободные символы, на которые ссылается выбранный код.
Символ считается «свободным», если он используется внутри выделенного фрагмента, но объявлен вне его. Свободные символы, являющиеся переменными, примерно соответствуют набору параметров, которые потребовались бы, если бы блок был вынесен в отдельную функцию.
Даже если вы не собираетесь извлекать блок в новую функцию, эта информация может помочь вам на лету определить, какие имена использует данный блок кода.
Каждый точечный путь идентификаторов (например, file.Name.Pos) отображается как отдельный элемент, благодаря чему можно увидеть, какие части сложного типа действительно используются.
Свободные символы тела функции могут раскрыть, что используется лишь небольшая часть (например, одно поле структуры) одного из параметров функции, что позволяет упростить и обобщить функцию, выбрав другой тип для этого параметра.
Поддержка редактора:
- VS Code: используйте пункт меню
Source action > Browse free symbols. - Emacs: требуется eglot v1.17. Используйте
M-x go-browse-freesymbolsиз github.com/dominikh/go-mode.el.
Просмотр ассемблера
Gopls предлагает третью веб-основанную код-действие — «Browse assembly for f» (Просмотр ассемблера для f), которая отображает список ассемблерных инструкций объявления функции f, содержащей выделенный код, а также любые вложенные функции, такие как литералы функций или отложенные вызовы.
Gopls вызывает компилятор для генерации отчета; перезагрузка страницы обновляет отчет.
Архитектура машины определяется конфигурацией сборки, которую gopls выбирает для текущего файла. Обычно это то же самое, что и ваша машина GOARCH, если только вы не работаете в файле с тегами go:build для другой архитектуры.
Gopls пока не может отображать ассемблер для дженерик-функций: дженерик-функции не компилируются полностью до их инстанцирования, но любая функция-обёртка для выделенного участка не может быть инстанцированной дженерик-функцией.
Поддержка редактора:
- VS Code: используйте пункт меню «Source action > Browse assembly for f».
- Emacs: требуется eglot v1.17. Используйте
M-x go-browse-assemblyиз github.com/dominikh/go-mode.el.
unusedwrite анализатор
Новый unusedwrite анализатор сообщает о присваиваниях, часто полям структур, которые не имеют эффекта, потому что, например, структура больше никогда не используется:
<code class="language-go">func scheme(host string) string {
u := &url.URL{
Host: host, // "unused write to field Host" (не нужно создавать URL)
Scheme: "https:",
}
return u.Scheme
}
</code>
Это, по крайней мере, указывает на то, что код излишне сложен (например, можно удалить мёртвый код), но часто указывает на ошибку, как в этом примере:
<code class="language-go">type S struct { x int }
func (s S) set(x int) {
s.x = x // "unused write to field x" (s should be a *S pointer)
}
</code>
stdversion анализатор
Новый
stdversion
анализатор предупреждает об использовании слишком новых символов стандартной библиотеки, основываясь на версии директивы go в файле go.mod. Это улучшает нашу поддержку более старых языковых версий (см. выше), даже если gopls был собран с использованием недавней версии Go.
Рассмотрим файл go.mod и файл Go ниже.
Объявление переменной var alias ссылается на тип types.Alias,
который был представлен в go1.22, но файл принадлежит модулю, который требует только go1.21, поэтому анализатор сообщает диагностическое сообщение:
<code>module example.com go 1.21 </code>
<code class="language-go">package p import "go/types" var alias types.Alias // types.Alias требует go1.22 или выше (модуль — go1.21) </code>
Когда отдельный файл помечен build-tag'ом для версии Go, отличной от версии модуля, анализатор применяет соответствующие проверки для версии файла.
Еще два анализатора vet
Анализаторы framepointer и sigchanyzer давно входили в состав go vet, но были упущены в предыдущих версиях gopls.
С этого момента gopls всегда будет включать все анализаторы, запускаемые vet.
Hover показывает информацию о размере/смещении и теги структур
При наведении курсора мыши на идентификатор, объявляющий тип или поле структуры, теперь отображается информация о размере типа:
и информация о смещении поля:
Кроме того, если доля потраченного пространства из-за неоптимального порядка полей структуры составляет 20% или выше, отображается процент потраченного пространства:
В приведённой выше структуре правила выравнивания требуют, чтобы каждое из двух логических полей (1 байт) занимало полное слово (8 байт), что приводит к (7 + 7) / (3 * 8) = 58% потерь. Размещение двух логических полей вместе позволило бы сэкономить слово.
Эта информация может быть полезна при оптимизации структур данных или при чтении ассемблерного кода.
Также при наведении курсора на ссылку на поле со структурным тегом отображается сам тег:
Hover и «Перейти к определению» работают с символами в комментариях документации
В Go 1.19 была добавлена поддержка doc links, позволяющая комментариям документации одного символа ссылаться на другой.
Операции Hover и Definition в Gopls теперь обрабатывают такие ссылки так же, как и идентификаторы, поэтому при наведении курсора на одну из них будет отображаться информация о символе:
Аналогично, «Перейти к определению» будет перенаправлять к объявлению ссылки. Благодарим @rogeryk за реализацию этой функции.
Исправленные ошибки
Благодарим наших участников!
@guodongli-google за анализатор unusedwrite.
TODO: они являются xoogler'ом; существует ли более актуальный аккаунт на GH?
@rogeryk
Исходные файлы для этой документации можно найти в golang.org/x/tools/gopls/doc.