将go文件导入同一文件夹


84

我在将本地go文件导入另一个go文件时遇到困难。

我的项目结构如下图所示

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

我正在尝试在b.go中导入a.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 2014年

谢谢@twotwotwo ...您能告诉我如何解决上述问题吗?另外,当我们在一个包中有multipe go文件时,导入应遵循完整路径,例如。github.com/xxxx/a或一个就可以了
g0c00l.g33k 2014年

对于Go模块,同一目录中的文件仍然是同一程序包的一部分,仍然需要具有相同的程序包名称(例如package foo),并且仍然不需要彼此直接导入。这个答案涵盖了更多关于Go模块的知识,包括如何在Go模块下的同一模块中导入软件包。
典型182

Answers:


76

一个目录中的任何数量的文件都是一个软件包。在一个文件中声明的符号对其他文件可用,而无需任何imports或限定符。所有文件package foo的顶部确实需要相同的声明(否则您会从中得到错误go build)。

你需要GOPATH设置到你的目录pkgsrc以及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 buildrun与多个文件main打交道,并且我没有费心测试,但听说(这里来自Dave Cheney )go run没有重建肮脏的依赖关系。

听起来您至少已尝试将GOPATH设置为正确的选项,所以如果您仍然遇到问题,则可能要确切说明如何设置环境变量(命令等)以及运行的命令以及发生的错误。这是有关如何在Linux / UNIX下进行设置(并使设置持久化)的说明这是Go团队对工作区设置的建议。也许没有帮助,但请看一下,至少可以指出如果感到困惑会使您感到困惑。


1
goimports很有帮助:)
g0c00l.g33k 2014年

如果您在运行主程序包中的多个文件时遇到问题,请参见此答案
瑞克·史密斯

我向package main同一目录中的所有文件添加了相同的声明,但是出现undefined错误,main.go无法从controllers.go同一目录中的文件中看到函数。
AME

2
@AlexChaliy如果使用go run,则可能需要显式地将两个文件名都传递给它,或者切换到将它们放入GOPATH中的包中并对其进行go build输入。还要仔细检查与包结构无关的常见错误(如拼写错误的名称)。如果以上方法都不能解决问题,我将以您能提供的所有细节打开一个新问题;它可能需要大量讨论才能准确地解决您的目录,文件等的外观,并且由于它专门针对您的设置,因此新问题似乎是解决该问题的最佳场所。
twotwotwo

40

只要将两者声明为同一包a.gob.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

我只是想要一些真正基本的东西来将一些文件移出主文件夹,例如user2889485的回复,但是他的特定答案对我没有用。我不在乎它们是否在同一包装中。

我的GOPATH工作区c:\work\go在下面

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

main.goimport "/pg/dbtypes"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.