【问题标题】:Packages layout with relative paths [duplicate]具有相对路径的包布局[重复]
【发布时间】:2020-02-24 04:53:35
【问题描述】:

我正在学习 Go,我做了这个例子: http://thenewstack.io/make-a-restful-json-api-go/ 构建一个简单的 REST API。

我已经编译过了,一切正常,但所有源代码都在主包中。

现在我想在包中组织我的 .go 文件,所以我以这种方式将它们移动到一些文件夹中:

GOPATH\bin
GOPATH\pkg
GOPATH\src\pack1\Handlers.go
GOPATH\src\pack1\Logger.go
GOPATH\src\pack1\repo.go
GOPATH\src\pack1\Todo.go
GOPATH\src\router\Router.go
GOPATH\src\router\Routes.go
GOPATH\src\Main.go

Main.go 使用了所有的路由器包,所以我把它放在了导入部分: “。/路由器”。 Router.go 使用 pack1 包,所以在 Router.go 中我导入了“../pack1”。 现在,如果我尝试“去构建 Main.go”,我会得到:

router\Router.go:6: imported and not used: "_/D_/GOPATH/src/pack1"
router\Router.go:14: undefined: Logger

和类似的错误,所以似乎我所做的pack1包的导入是错误的。当然,在所有属于 pack1 的文件中,我在标题中放置了“package pack1”定义。

我还了解到 Go 中不建议使用相对导入,使用远程包(例如广告导入“github.com/myrepo/mypackage”)可能会很有用。 但我不想使用远程导入;我想马上推送我所有的文件。

您能否帮助我更好地理解在 Go 中的包之间进行本地导入的方式是什么?

【问题讨论】:

  • 通过How to Write Go Code阅读(或重新阅读)这将更详细地解释所有内容。
  • 请注意,错误显示为“已导入且未使用”,因此导入有点工作,但您没有使用包 pack1 的任何符号。这与下一个错误“未定义:记录器”有关:如果 Logger 位于包 pack1 中,那么您从任何其他包中将其引用为 pack1.Logger。重新阅读“如何编写 Go 代码”,并在线查看一些工作包。
  • 谢谢大家的回答,现在我已经了解如何正确导入包了!这样也更容易!我还有最后一个问题:我仍然无法编译项目:在 Router.go 中有一个 Logger 实例,因此在 Router.go 中我已经导入了包“pack1”,但它说 Logger 未定义:\ 我在哪里做错了吗?
  • @RobertoMilani:请显示导致错误的代码示例。你要么需要用包名来限定标识符,要么你没有定义你认为你所在的地方。
  • 当然!这是包“router”(pastebin.com/P9uTRedF)中的 Router.go,这是包“pack1”(pastebin.com/STWRMZFs)中的 Logger。谢谢 m8

标签: go package


【解决方案1】:

您不应该使用相对导入的原因是它们在$GOPATH 内不起作用。摆脱导入路径的“相对”部分,因为所有导入都相对于 $GOPATH/src

import (
    "pack1"
    "router"
)

您还需要将您的 Main.go 移动到一个包中,这样您就可以充分利用 go 工具。

【讨论】:

  • 谢谢你!现在我明白了,我所有的进口都可以! :) 如果我从 Router.go 调用一个在 pack1 内的 .go 文件中定义的函数,我该怎么办?我已经从 Router.go 导入了 pack1,但是当我尝试“安装”时,它说该功能未定义...:\提前致谢
  • 问题已解决,之前我使用不同包中的类时缺少包名。
【解决方案2】:

正如 JimB 所说,通读“如何编写 go 代码”链接,特别是 https://golang.org/doc/code.html#ImportPaths

  • 所有包都存在于从 $GOPATH/src 开始的目录树中。
  • 导入路径实际上是包的完整路径(从 1 开始)
  • GO 中没有子包。
  • 主包用于创建命令

因此,在您的情况下,您的导入路径将是“pack1”和“router”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 2016-02-03
    • 2018-06-18
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多