即使文件存在,通过 github.com repo 的 Golang 本地导入也不起作用

标签 go package

我确实知道 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)

如果我走那条路,项目就在那里!是什么赋予了?为什么不导入?

最佳答案

一个包有两个东西:

  1. 一个名字。这是由 package thename 声明设置的。
  2. 导入 路径。这个路径是相对于 $GOPATH/src 的。

你应该(这里没有争论)做以下事情:

  1. 名称导入 路径 的最后一个组件应该匹配。例如。如果导入路径是“sun/moon/stars”而不是包名是“stars”。 (很多人都弄错了,要么将包或文件夹称为 go-stars 之类的东西。不要那样做。)

  2. 磁盘上的文件夹结构必须与包的导入路径相匹配。如果您的包的导入路径是“whatever/random/noise”,您必须将它放在 $GOPATH/src/whatever/random/noise 下。或者反过来说:如果你的代码在 $GOPATH/src/ill/do/it/my/own/way 那么包“way”的导入路径是“ill/do/it/my/own/way ".

  3. 如果您希望您的包能够go get将其放置在已知的代码托管上并通过完整的导入路径导入它。可能会限制导入路径。将包“foo”的代码放在 $GOPATH/src/github.com/you/repo/whatever/deep/folder/structure/foo 下并使用 import "github.com/you/repo/whatever/deep/文件夹/结构/foo"

  4. 您所有的路径和包名称都应全部小写。

归结为:不要做任何花哨的事情,保持自然。导入路径和文件夹结构必须匹配。

关于即使文件存在,通过 github.com repo 的 Golang 本地导入也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52254046/

相关文章:

go - 在go中将回溯堆栈拆分为结构

python - 如何更改Python 2.7安装包文件夹

java - 有没有办法强制类加载器加载一个包,即使它的类都没有被加载?

java - 在java中导入我们自己的类

go - 匿名结构无法使用复合文字进行编译

go - 从32位中获取一位的值

swift - 为 swift 包添加 swift 扩展

java - 无法使用 appium-android 创建新 session ,但我给出了正确的包名称

go - 迭代结构中的字符串字段

go - 为什么在 Go 中划分两个 time.durations 会导致另一个 time.duration?