импортировать файлы go в одну папку

Мне трудно импортировать файл локального go в другой файл go.

Моя структура проекта похожа на что-то ниже

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

Я пытаюсь импортировать a.go внутри b.go. Я попробовал следующее:

import "a"
import "github.com/xxxx/a"

Ни один из них не работал. Я понимаю, что мне приходится вмешиваться в GOPATH, но я не мог понять это правильно. В настоящее время мой GOPATH указывает на samplego (/workspace/samplego). Я получаю следующую ошибку

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

Кроме того, как работает GOPATH, когда эти исходные файлы импортируются в другой проект/модуль? Будет ли тогда локальный импорт проблемой? Какова наилучшая практика в этом случае - это иметь только один файл go в модуле (со связанными тестами)?

Ответы

Ответ 1

Любое количество файлов в каталоге - это один пакет; символы, объявленные в одном файле, доступны для других без каких-либо import или квалификаторов. Все файлы нуждаются в одном и том же объявлении package foo вверху (или вы получите сообщение об ошибке из go build).

Вам нужно, чтобы GOPATH установлен в каталог, в котором находятся ваши pkg, src и bin. Это всего лишь вопрос предпочтения, но для общего использования у вас есть одно рабочее пространство для всех ваших приложений (иногда $HOME), а не одно приложение.

Обычно путь Github будет github.com/username/reponame (а не только github.com/xxxx). Поэтому, если вы хотите иметь main и другой пакет, вы можете в конечном итоге сделать что-то в workspace/src как

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

Обратите внимание, что вы всегда импортируете с полным пути github.com/...: относительный импорт не разрешен в рабочей области. Если вы устали от ввода путей, используйте goimports. Если вы получали путем с go run, это время, чтобы перейти к go build: run сделки плохо с множественным файлом main и я не удосужился проверить, но слышал (от Dave Чейни здесь) go run не перестраивают грязные зависимости.

Похоже, вы, по крайней мере, пытались правильно настроить GOPATH, поэтому, если вы все еще застряли, возможно, укажите, как вы устанавливаете переменную среды (команду и т.д.) И какую команду вы выполняете и какая ошибка. Ниже приведены инструкции о том, как установить его (и сделать постоянный параметр) в Linux/UNIX, и вот совет команды Go по настройке рабочей области. Возможно, ни одна из них не помогает, но взгляните и, по крайней мере, укажите, какая часть вас смущает, если вы в замешательстве.

Ответ 2

Импорт не требуется, если вы заявляете, что оба a.go и b.go должны находиться в одном пакете. Затем вы можете использовать go run для распознавания нескольких файлов с помощью:

$ go run a.go b.go

Ответ 3

./main.go (в основной упаковке)
. /a/a.go (в пакете a)
. /a/b.go (в пакете a)

в этом случае:
main.go import "./a"

Он может вызывать функцию в a.go и b.go, что с первой буквой.

Ответ 4

Я просто хотел что-то действительно простое, чтобы переместить некоторые файлы из главной папки, например, ответ user2889485, но его конкретный ответ не сработал для меня. Мне было все равно, если они были в одной упаковке или нет.

Моя рабочая область GOPATH - c:\work\go и под ней у меня есть

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

в main.go я import "/pg/dbtypes"