Линтер в 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
устарел.
Если у вас все еще есть аналогичная проблема, вероятно, вы столкнулись с другой проблемой. Пожалуйста, начните новый вопрос.
- Обновление инструментов установки/обновления для GO
- Откройте свой код как основной проект в 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
Проблема: Попытка пометить как, когда он находится в другом каталоге.
Решения:
- Переместитесь в корень проекта и сохраните имя пакета; все работает как положено,
- или же
- Изменить имя пакета 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, он будет жаловаться.
Почти выдернув волосы, я обнаружил, что линтинг работает, но у меня было много файлов с ошибками. Я еще не нашел иерархии, которой следовали, но исправление проблем в одном файле впоследствии привело к правильному линтингу другого файла. Я думаю, что это следует за деревом выполнения, хотя я не проверял это. Меня это раздражает, поскольку это может ошибочно привести вас к мысли, что линтинг не работает, хотя на самом деле это подкладывание файла, на котором вы в настоящее время не сосредоточены, особенно если вы сгенерировали файлы, которые вам не интересны.