Линтер в VS-коде не работает для пакетов из нескольких файлов?

Я установил расширение Go (версия 0.11.4) в Visual Studio Code на MacOS:

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

package foobar

import "fmt"

func main() {
    fmt.Println(SayHello())
}

и файл bar.go с

package foobar

func SayHello() string {
    return "Hello, world!"
}

затем в foo.go Я получаю сообщение об ошибке линтера SayHello является undeclared name:

Я читал здесь о подобной проблеме (https://github.com/golang/lint/issues/57), но, поскольку этой проблеме уже пять лет, я решил, что она уже может быть исправлена? Или делаетgolint просто не работают с несколькими файлами?

14 ответов

Я столкнулся с той же проблемой. Я обнаружил, что столкнулся с этой проблемой после включения "языкового сервера Go", который является экспериментальной функцией. Я отключил его в настройках кода VS->Go Configuration, и после этого проблема исчезла.

Обновление VS Code Go Tool может помочь.Command + Shift + P -> Go: Install/update toolsУстановите все инструменты и перезапустите VS Code.

Причиной этого предупреждения для меня была настройка go.lintOnSave, который был установлен на file. Изменение значения на package заставил линтер правильно подбирать типы, определенные в других файлах.

Для людей, которые здесь оказались:

Плагин сильно изменился с 2019 года.

  • В 2021 году Go Module стал модулем по умолчанию, который, возможно, изменил способ построения и анализа программы.
  • Плагин vscode-go по умолчанию используется в качестве языкового сервера. Обратите внимание, что в 2019 году было два разных языковых сервера и gopls все еще находился в экспериментальном режиме.
  • golint устарел.

Если у вас все еще есть аналогичная проблема, вероятно, вы столкнулись с другой проблемой. Пожалуйста, начните новый вопрос.

  1. Обновление инструментов установки/обновления для GO
  2. Откройте свой код как основной проект в VS Code и избегайте нескольких проектов/рабочих областей в одном и том же VS Code.**

Код VS для одного проекта

**

**

Избегайте нескольких проектов в VS Code

**

Если вы столкнетесь с этим и НЕ используете модули, то добавление go.useLanguageServer: false отключит gopls и вернет вас в вашу прежнюю среду. (это означает, что vscode теперь распознает функции и структуры, определенные в нескольких файлах в одном пакете)

В моем случае это отсутствовало go.modфайл. Я исправил с помощью следующей команды:

      go mod init example.com/myProject/myModule

Конечно, вам следует использовать более разумное имя модуля.

Сделайте чистое удаление vscode, и тогда он снова будет работать нормально...

добавьте sudo, если вам нужно

rm -rf $HOME/Library/Application\ Support/Code

rm -rf $HOME/.vscode

удалить vscode из приложения

скачайте vscode и установите снова

Одна из возможных причин:

Если вы ссылаетесь на функцию/переменную, объявленную в тестовом файле (*_test.go) из нетестового файла, будет выдана эта ошибка.

Большинство ответов здесь не охватываютbuildtagсценарий. Сообщения об ошибках не указывают на это. Если ни одно из других решений не сработает, вполне возможно, что используемый вами модуль использует тег сборки. Найдите свою кодовую базу (cmd + shift + fили значок лупы на левой панели) для//go:build. В моем случае у меня было:

      //go:build linux

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

      { //your settings.json
  //...,
  "gopls": {
    "build.buildFlags": ["-tags=linux"],
  },
  //...
}

обратите внимание, что ваш флаг сборки может отличаться, поэтому заменитеlinuxс тем, что у тебя есть. Вы можете указать более одного тега, например["-tags=linux,tag1,tag2,etc"].

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

В моем случае я просто перезапустил VS Code, и ошибка исчезла.

Я столкнулся с этой проблемой, установив расширение go и попытавшись использовать то же имя пакета с модулем в другом каталоге.

  • Файлы в корне: , a.go, а также go.mod
  • Подкаталог: nested/b.go

Проблема: Попытка пометить как, когда он находится в другом каталоге.

Решения:

  1. Переместитесь в корень проекта и сохраните имя пакета; все работает как положено,
  • или же
  1. Изменить имя пакета from package mainк package nested, затем добавьте импорт для main.goс помощью:
      // main.go
package main

import "example/nested"

func main() {
    A()
    nested.B()
}

а также b.go:

      // b.go
package nested

import "fmt"

func B() {
    fmt.Println("Hello from B")
}

Другое решение может заключаться в том, что вам нужно открыть папку в VS Code с включенным файлом go.mod. Таким образом, у вас может быть структура папок, которая выглядит как workspace/application/modules/xyz.go. Если у вас есть файл go.mod в папке приложения, а модули - это папка, которую вы открыли в VS Code, он будет жаловаться.

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

Другие вопросы по тегам