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


Любое количество файлов в каталоге с самого начала является частью одного пакета. (И у них должно быть одно и то же 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 с заглавными буквами.


0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.