我确实知道 Go 对于导入来说很古怪,但我已经尝试(我相信)遵循约定,但是我无法导入结构。
项目结构:
/project-name
/parser/main.go
/query/main.go
... Project files in root
我在 /parser/main.go
导出了一个结构:
package parser
type SomeTranslationStuff struct {
ID int `json:"Id"`
Language string `json:"Language"`
}
我希望在 /query/main.go
中导入它。
我是这样做的:
import (
"github.com/org/project-name/parser"
)
它不导入它 - 我遇到了“在 Gopath 中找不到包......”。
我的项目存在于:Users\user\go\src\project-name
。导入的项目(这是同一个项目,通过 go get 从 github 导入)确实存在于 Users\user\go\src\github.com\org\project-name
.. 一切似乎都符合到导入东西的“Go”方式,但它似乎没有导入?
它具体说:
Cannot find package name:
C:\Users\user\go\src\github.com\org\project-name\parser(from $GOPATH)
如果我走那条路,项目就在那里!是什么赋予了?为什么不导入?
最佳答案
一个包有两个东西:
- 一个名字。这是由
package thename
声明设置的。 - 导入 路径。这个路径是相对于 $GOPATH/src 的。
你应该(这里没有争论)做以下事情:
名称 和导入 路径 的最后一个组件应该匹配。例如。如果导入路径是“sun/moon/stars”而不是包名是“stars”。 (很多人都弄错了,要么将包或文件夹称为 go-stars 之类的东西。不要那样做。)
磁盘上的文件夹结构必须与包的导入路径相匹配。如果您的包的导入路径是“whatever/random/noise”,您必须将它放在 $GOPATH/src/whatever/random/noise 下。或者反过来说:如果你的代码在 $GOPATH/src/ill/do/it/my/own/way 那么包“way”的导入路径是“ill/do/it/my/own/way ".
如果您希望您的包能够
go get
将其放置在已知的代码托管上并通过完整的导入路径导入它。可能会限制导入路径。将包“foo”的代码放在 $GOPATH/src/github.com/you/repo/whatever/deep/folder/structure/foo 下并使用import "github.com/you/repo/whatever/deep/文件夹/结构/foo"
您所有的路径和包名称都应全部小写。
归结为:不要做任何花哨的事情,保持自然。导入路径和文件夹结构必须匹配。
关于即使文件存在,通过 github.com repo 的 Golang 本地导入也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52254046/