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

我有困难导入一个本地去文件到另一个去文件。

我的项目结构就像下面的东西

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

我正在尝试导入 a 进入 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 文件(以及相关的测试) ?

156082 次浏览

一个目录中的任意数量的文件都是一个包; 一个文件中声明的符号对其他文件可用,没有任何 import或限定符。所有的文件都需要在顶部使用相同的 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 build了: run对多文件 main的处理很糟糕,我没有费心去测试,但是听说(来自 Dave Cheney 给你) go run不会重建肮脏的依赖关系。

听起来你至少尝试过设置 GOPATH 到正确的地方,所以如果你仍然卡住了,也许包括你是如何设置环境变量的(命令等) ,你运行的命令是什么,发生了什么错误。下面是关于如何在 Linux/UNIX 下设置它(并使设置持久化)的说明以下是 Go 团队对工作区设置的建议。也许两者都没有帮助,但如果你感到困惑,看一看,至少指出哪一部分让你感到困惑。

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

在这种情况下:
进口

It can call the function in the a.go and b.go,that with first letter caps on.

No import is necessary as long as you declare both a.go and b.go to be in the same package. Then, you can use go run to recognize multiple files with:

$ go run a.go b.go

我只是想一些真正基本的移动一些文件的主文件夹,如用户2889485的回复,但他的具体答案不适合我。我不在乎它们是否在同一个包裹里。

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

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

main.go I import "/pg/dbtypes"

正如前面提到的,不需要使用任何导入。 很多人提到,当您提到大多数文件时,使用 go run 是可能的,但是如果在同一个目录中使用 multiple .go-files,则会很麻烦。 Therefore using go run *.go is what I usually do.

如果上面的答案都不管用,

试试看,

go run .

用于制作,

go build

This will take care of all the .go files in the folder.

据我所知,在您的项目子文件夹中的包现在可以做,只需要添加“在模块前面,比如 . "github.com/ilyasf/deadlock-train/common" 在这里,我的主模块名和通用 github.com/ilyasf/deadlock-train 只是来自 project 内部/common 子文件夹的包。

Go1.19.1 版本在这里。我刚才也有同样的问题,发现你必须简单的做: import (a "github.com/xxxx")