导入同一文件夹中的go文件

g0c*_*33k 66 import path go

我很难将本地go文件导入另一个go文件.

我的项目结构如下所示

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
Run Code Online (Sandbox Code Playgroud)

我想在b.go里面输入a.go. 我试过以下,

import "a"
import "github.com/xxxx/a"
Run Code Online (Sandbox Code Playgroud)

这些都没有奏效.我明白我必须干涉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)
Run Code Online (Sandbox Code Playgroud)

另外,当这些源文件导入另一个项目/模块时,GOPATH如何工作?那么当地的进口是一个问题吗?在这种情况下,最佳做法是什么 - 它是否只在模块中有一个go文件(带有相关的测试)?

two*_*two 63

目录中的任意数量的文件都是单个包; 在一个文件中声明的符号可供其他人使用,不带任何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
Run Code Online (Sandbox Code Playgroud)

请注意,始终使用完整github.com/...路径导入:工作空间中不允许相对导入.如果您厌倦了键入路径,请使用goimports.如果你用得到的go run,它的时间切换到go build:run与不良的交易多文件mainS和我没有刻意去试验,但听说过(来自Dave切尼这里)go run不重建脏的依赖.

听起来你至少试图将GOPATH设置为正确的东西,所以如果你仍然卡住,可能包括你如何设置环境变量(命令等)以及你运行的命令和发生了什么错误.以下是有关如何在Linux/UNIX下设置它(并使设置保持不变)的说明,这里是Go团队关于工作区设置的建议.也许两者都没有帮助,但看一看,如果你感到困惑,至少要指出哪个部分会让你困惑.

  • @AlexChaliy 如果您正在使用 `go run`,则可能需要将两个文件名显式传递给它,或者切换到将它们放在 GOPATH 中的一个包中并进行 `go build`。还要仔细检查与包结构无关的常见错误(如输入的名称)。如果这些都不能解决问题,我会用你所能提供的所有细节打开一个新问题;可能需要对 _your_ 目录、文件等具体如何解决进行大量讨论,并且由于它专门针对您的设置,因此新问题似乎是解决此问题的最佳场所。 (3认同)

Jas*_*Kao 26

只要您声明两者a.go并且b.go在同一个包中,就不需要导入.然后,您可以使用以下go run方法识别多个文件:

$ go run a.go b.go
Run Code Online (Sandbox Code Playgroud)

  • 不,这是足够的答案.声誉@GillesGouaillardet正在谈论:) (8认同)
  • 这并没有提供问题的答案.一旦你有足够的[信誉](https://stackoverflow.com/help/whats-reputation),你就可以[评论任何帖子](https://stackoverflow.com/help/privileges/comment); 相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替). - [来自评论](/ review/low-quality-posts/19039597) (2认同)

小智 10

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

在这种情况下:
main.go import"./a"

它可以调用a.go和b.go中的函数,即带有首字母大写字母.


小智 10

如果以上答案都不起作用,

你试一试,

go run .
Run Code Online (Sandbox Code Playgroud)

用于生产,

go build
Run Code Online (Sandbox Code Playgroud)

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