【问题标题】:importing go files in same folder在同一文件夹中导入 go 文件
【发布时间】:2015-01-12 13:29:33
【问题描述】:

我在将本地 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...你能告诉我如何解决上述问题吗?此外,当我们在一个包中有多个 go 文件时,导入是否应该遵循完整路径,例如。 github.com/xxxx/a 或者只是一个会做
  • 对于 Go 模块,同目录下的文件仍然是同一个包的一部分,仍然需要具有相同的包名(例如,package foo),仍然不需要直接导入每个其他。这个answer 更多地介绍了 Go 模块,包括如何在 Go 模块下的同一模块中导入包。

标签: import path go


【解决方案1】:

目录中任意数量的文件都是一个包;在一个文件中声明的符号可供其他文件使用,无需任何 imports 或限定符。所有文件都需要在顶部使用相同的package foo 声明(否则您将收到来自go build 的错误)。

您确实需要将GOPATH 设置为您的pkgsrcbin 目录所在的目录。这只是一个偏好问题,但通常为所有应用(有时$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 处理多文件mains 的性能很差,我没有费心去测试但听说了(来自 Dave Cheney herego run 不会重建脏依赖。

听起来您至少尝试将 GOPATH 设置为正确的东西,所以如果您仍然卡住,可能包括您如何设置环境变量(命令等)以及您运行了什么命令以及什么发生错误。 Here are instructions on how to set it (and make the setting persistent) under Linux/UNIXhere is the Go team's advice on workspace setup。也许两者都没有帮助,但是如果您感到困惑,请看一下并至少指出哪个部分让您感到困惑。

【讨论】:

  • goimports 很有帮助 :)
  • 如果您在运行主包中的多个文件时遇到问题,请参阅this answer
  • 我在同一目录中的所有文件中添加了相同的package main 声明,但出现undefined 错误,main.go 无法看到位于同一目录中的文件controllers.go 中的函数.
  • @AlexChaliy 如果您使用的是go run,您可能需要明确地将两个文件名传递给它,或者切换到将它们放入您的GOPATH 中的一个包中并go building 它。还要仔细检查与包结构无关的常见错误(如拼写错误的名称)。如果这些都不能解决问题,我会提出一个新问题,提供所有细节;可能需要对 您的 目录、文件等如何解决问题进行大量讨论,并且由于它专门针对您的设置,因此一个新问题似乎是解决此问题的最佳场所。
【解决方案2】:

./main.go(在 main 包中)
./a/a.go(在包 a 中)
./a/b.go(在包a中)

在这种情况下:
main.go 导入“./a”

可以调用a.go和b.go中首字母大写的函数。

【讨论】:

    【解决方案3】:

    只要您声明a.gob.go 在同一个包中,就不需要导入。然后,您可以使用go run 识别多个文件:

    $ go run a.go b.go
    

    【讨论】:

      【解决方案4】:

      我只是想要一些非常基本的东西来将一些文件移出主文件夹,比如 user2889485 的回复,但他的具体答案对我不起作用。我不在乎它们是否在同一个包裹中。

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

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

      main.goimport "/pg/dbtypes"

      【讨论】:

        【解决方案5】:

        正如人们之前提到的,没有必要使用任何导入。 很多人提到,当你提到大多数文件时,使用 go run 是可能的,但是当在同一个目录中有 多个 .go-files 时,它可能会很麻烦。 因此使用go run *.go 是我通常的做法。

        【讨论】:

          【解决方案6】:

          如果以上答案均无效,

          试试吧,

          go run .
          

          用于生产,

          go build
          

          这将处理文件夹中的所有 .go 文件。

          【讨论】:

            【解决方案7】:

            据我了解,对于您项目子文件夹中的包,现在可以这样做,只需添加“。”在模块前面,比如 . "github.com/ilyasf/deadlock-train/common" 其中 github.com/ilyasf/deadlock-train 我的主模块名称和 common 只是项目内 /common 子文件夹中的包。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-10-07
              • 1970-01-01
              • 1970-01-01
              • 2022-11-03
              • 2011-05-21
              相关资源
              最近更新 更多