Gopls: Пассивные функции

На этой странице описаны базовые функции LSP, которые могут быть описаны как «пассивные», поскольку многие редакторы используют их для непрерывного предоставления информации о ваших исходных файлах без необходимости в специальном действии.

См. также Code Lenses, некоторые из которых аннотируют ваш исходный код дополнительной информацией и могут быть также рассмотрены как пассивные функции.

Hover

Запрос LSP textDocument/hover возвращает описание кода, находящегося в данный момент под курсором, например его имя, тип, значение (для константы), сокращённое объявление (для типа), комментарий документации (если есть) и ссылку на документацию символа на pkg.go.dev. Клиент может запросить либо обычный текст, либо Markdown.

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

Ссылки в документации: комментарий документации может ссылаться на другой символ с использованием квадратных скобок, например [fmt.Printf]. Наведение курсора на одну из таких ссылок в документации показывает информацию о ссылочном символе.

Информация о размере/смещении структуры: для объявлений типов структур наведение курсора на имя показывает размер структуры в байтах:

А наведение курсора на каждое имя поля показывает размер и смещение этого поля:

Эта информация может быть полезна при оптимизации размещения ваших структур данных или при чтении ассемблерных файлов или трассировок стека, которые ссылаются на каждое поле по его криптическому байтовому смещению.

Кроме того, Hover показывает:

  • класс размера структуры, который представляет собой количество байтов, фактически выделенных средой выполнения Go для одного объекта этого типа; и
  • процент потраченного пространства из-за неоптимального порядка полей структуры, если эта цифра составляет 20% или выше:

В приведённой выше структуре правила выравнивания требуют, чтобы каждое из двух логических полей (1 байт) занимало полное слово (8 байт), что приводит к потере (7 + 7) / (3 * 8) = 58%. Размещение двух логических полей вместе позволило бы сэкономить слово. (В большинстве структур ясность важнее компактности, поэтому следует переставлять поля для экономии места только в тех структурах данных, которые были показаны профилированием как очень часто выделяемые.)

Директивы embed: наведение курсора на шаблон имени файла в директиве //go:embed, например *.html, показывает список имён файлов, на которые раскрывается символ подстановки.

Директивы linkname: //go:linkname директива создаёт псевдоним на другой символ на уровне компоновщика. Наведение курсора на директиву показывает информацию о другом символе.

Информация о наведении для символов из стандартной библиотеки, добавленных после Go 1.0, указывает версию Go, в которой был добавлен символ.

Настройки:

Особенности:

Поддержка клиентами:

Подсказка сигнатуры

Запрос textDocument/signatureHelp в LSP возвращает информацию о самой внутренней функции, вызванной в позиции курсора или выделения, включая сигнатуру функции и имена, типы и документацию каждого параметра.

Клиенты могут предоставить эту информацию, чтобы помочь пользователю вспомнить назначение каждого параметра и их порядок при чтении или редактировании вызова функции.

Скобки вызова не требуются, если курсор находится внутри идентификатора, обозначающего функцию или метод. Например, подсказка сигнатуры в once.Do(initialize‸) будет описывать initialize, а не once.Do.

Поддержка клиентами:

Выделение документа

Запрос LSP textDocument/documentHighlight сообщает о наборе диапазонов исходного кода, которые должны быть выделены в зависимости от текущей позиции курсора или выделения, чтобы подчеркнуть их взаимосвязь.

Каждая из следующих частей синтаксиса образует набор, так что если вы выберете любой один элемент, gopls выделит весь набор:

Более одного из этих правил может быть активировано одним и тем же выделением, например, идентификатором, который также является операндом возврата.

Различные вхождения одного и того же идентификатора могут быть окрашены по-разному, чтобы различать ссылки на переменную символа, которые являются «чтением» и «записью».

Поддержка клиентами:

Подсказка вставки

Запрос LSP textDocument/inlayHint возвращает набор аннотаций, которые вставляются в текущий файл, чтобы раскрыть скрытую информацию.

Примеры:

См. Подсказки вставки для полного списка с примерами.

Настройки:

Поддержка клиентами:

Семантические токены

Запрос LSP textDocument/semanticTokens сообщает информацию обо всех токенах в текущем файле или его части. Клиент может использовать эту информацию для предоставления подсветки синтаксиса, которая передаёт семантические различия между, например, функциями и типами, константами и переменными, или функциями библиотеки и встроенными функциями.

Клиент должен указать наборы типов и модификаторов, представляющих интерес.

Gopls сообщает следующие типы токенов:

Gopls также сообщает следующие стандартные модификаторы:

а также эти нестандартные модификаторы, каждый из которых представляет конструктор верхнего уровня для типа каждого символа:

Настройки:

Поддержка клиентов:

Folding Range

Запрос LSP textDocument/foldingRange сообщает список регионов в текущем файле, которые могут быть независимо свернуты или развернуты. Например, может быть удобно свернуть большие комментарии или функции при изучении некоторого кода, чтобы большая часть кода помещалась на одном экране.

Протокол позволяет клиентам указывать, предпочитают ли они точные диапазоны, такие как пары скобок, или только диапазоны, состоящие из полных строк.

Поддержка клиентов:

Запрос LSP textDocument/documentLink использует эвристику для извлечения URL-адресов из комментариев документации и строковых литералов в текущем файле, чтобы клиент мог отображать их как кликабельные ссылки.

Помимо явных URL-адресов, gopls также преобразует строковые литералы в инструкциях импорта в ссылки на документацию pkg.go.dev для импортируемого пакета.

Настройки:

Поддержка клиентов:


Исходные файлы этой документации можно найти в golang.org/x/tools/gopls/doc.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang