Подтвердить что ты не робот

Go build: "Не удается найти пакет" (хотя GOPATH установлен)

Несмотря на то, что я правильно установил GOPATH, я все равно не могу получить "go build" или "go run", чтобы найти свои собственные пакеты. Что я делаю неправильно?

$ echo $GOROOT
/usr/local/go

$ echo $GOPATH
/home/mitchell/go

$ cat ~/main.go
package main
import "foobar"
func main() { }

$ cat /home/mitchell/go/src/foobar.go
package foobar

$ go build main.go
main.go:3:8: import "foobar": cannot find package
4b9b3361

Ответ 1

Это не работает, потому что ваш исходный файл foobar.go не находится в каталоге с именем foobar. go build и go install пытаются сопоставить каталоги, а не исходные файлы.

  • Установите $GOPATH в действительный каталог, например. export GOPATH="$HOME/go"
  • Переместите foobar.go в $GOPATH/src/foobar/foobar.go, и построение должно работать нормально.

Дополнительные рекомендуемые шаги:

  • Добавьте $GOPATH/bin к вашему $PATH с помощью: PATH="$GOPATH/bin:$PATH"
  • Переместите main.go в подпапку $GOPATH/src, например. $GOPATH/src/test
  • go install test должен теперь создать исполняемый файл в $GOPATH/bin, который можно вызвать, введя test в ваш терминал.

Ответ 2

Изменить: поскольку вы имели в виду GOPATH, см. fasmat answer (upvoted)

Как уже упоминалось в "Как мне найти мой пакет?, вам нужно поместить пакет xxx в каталог xxx.

См. Перейти к языковой спецификации:

package math

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

Организация кода упоминает:

При создании программы, которая импортирует пакет "widget", команда go ищет src/pkg/widget внутри корня Go, а затем - если источник пакета там не найден - он ищет src/widget внутри каждой рабочей области в порядке.

( "рабочая область" - это запись пути в вашем GOPATH: эта переменная может ссылаться на несколько путей для вашего "src, bin, pkg" )


(Оригинальный ответ)

Вы также должны установить GOPATH в ~/go, а не GOROOT, как показано в " Как записать код перехода".

Путь Go используется для разрешения операторов импорта. Он реализуется и документируется в пакете go/build.

В переменной среды GOPATH перечислены места для поиска кода Go.
В Unix значение представляет собой строку, разделенную двоеточием.
В Windows значение представляет собой строку с разделителями с запятой.
В Plan 9 значение представляет собой список.

Это отличается от GOROOT:

Бинарные дистрибутивы Go предполагают, что они будут установлены в /usr/local/go (или c:\Go под Windows), но их можно установить в другом месте.
Если вы это сделаете, вам нужно будет установить переменную среды GOROOT в этот каталог при использовании инструментов Go.

Ответ 3

TL; DR: следуйте правилам Go! (урок усвоен трудным путем), проверьте наличие старых версий go и удалите их. Установите последнюю версию.

Для меня решение было другим. Я работал на общем сервере Linux, и после нескольких GOPATH и других переменных среды он все еще не работал. Я столкнулся с несколькими ошибками, включая "Не удается найти пакет" и "Нераспознанный путь импорта". После попытки переустановки с этим решением по инструкциям на golang.org (включая часть удаления) все еще возникали проблемы.

Мне потребовалось некоторое время, чтобы осознать, что все еще есть старая версия, которая не была удалена (запущенная go version which go снова which go... DAHH), которая дала мне этот вопрос и, наконец, решила.

Ответ 4

Вы пытались добавить абсолютный каталог go к своему "пути"?

export PATH=$PATH:/directory/to/go/