импорт файлов go в ту же папку

86

Мне сложно импортировать локальный файл 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 в модуле (с соответствующими тестами)?

g0c00l.g33k
источник
Любое количество файлов в каталоге с самого начала является частью одного пакета. (И у них должно быть одно и то же package aобъявление вверху.)
twotwotwo
Спасибо @twotwotwo ... Не могли бы вы сообщить мне, как решить указанную выше проблему? Кроме того, когда в пакете есть несколько файлов go, импорт должен следовать по полному пути, например. github.com/xxxx/a или просто
подойдет
Для модулей Go файлы в одном каталоге по-прежнему являются частью одного и того же пакета, по-прежнему должны иметь одно и то же имя пакета (например, package foo) и по-прежнему не нужно напрямую импортировать друг друга. Этот ответ немного больше описывает это для модулей Go, в том числе о том, как импортировать пакеты в том же модуле в модулях Go.
типичный 182, 01

Ответы:

79

Любое количество файлов в каталоге - это один пакет; символы, объявленные в одном файле, доступны другим без каких-либо imports или квалификаторов. Для всех файлов нужно одно и то же 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сделки плохо с множественным файлом mains , и я не стал тестом , но слышал (от Dave Чейни здесь ) go runне перестраивает грязные зависимости.

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

два, два
источник
1
goimports был весьма полезен :)
g0c00l.g33k
Если у вас возникли проблемы с запуском нескольких файлов в основном пакете, см. Этот ответ .
Рик Смит
Я добавил одно и то же package mainобъявление ко всем файлам в одном каталоге, но у меня есть undefinedошибка, я main.goне могу видеть функции из файла, controllers.goкоторый находится в том же каталоге.
ame
2
@AlexChaliy Если вы используете go run, вам может потребоваться явно передать ему оба имени файла или переключиться на их размещение в пакете в GOPATH и go buildего загрузку . Также дважды проверьте наличие распространенных ошибок, не связанных со структурой пакета (например, опечатки в имени). Если ничего из этого не решит, я бы открыл новый вопрос со всеми возможными подробностями; может потребоваться много дискуссий о том , как именно должны выглядеть ваш каталог, файлы и т. д., и, поскольку речь идет именно о вашей настройке, новый вопрос кажется лучшим местом для этого.
twotwotwo 08
41

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

$ go run a.go b.go
Джейсон Као
источник
14

./main.go (в пакете main)
./a/a.go (в пакете a)
./a/b.go (в пакете a)

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

Он может вызывать функцию в a.go и b.go с заглавными буквами.

user2889485
источник
0

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

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

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

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

Дэйв Пайл
источник