【问题标题】:How to import packages between themselves under one repository in golang?如何在golang的一个存储库下相互导入包?
【发布时间】:2015-01-09 07:31:45
【问题描述】:

我想了解如何在后面的示例中正确导入包。

我已阅读此主题 (How to use custom packages in golang?),但它并没有解释我想要理解的内容。

例如,我想创建包以便在我的程序中进一步使用它并在 github.com 上发布。在我看来,这就是代码的组织方式:

src/
  github.com/
    username/
      repository/
        lib1.go #package repository
        lib2.go #package repository
        sublib/
          sublib1.go #package sublib
          sublib2.go #package sublib
      ...

  myproject/
    programname.go #package main
    #there is no problem how to import my repository here:
    #import "github.com/username/repository"
    #or import "github.com/username/repository/sublib" 

好的,此时我想了解如何在repository/sublib 中导入repository 的代码,反之亦然。我认为问题更针对内部导入(在一个存储库下)。

第一个解决方案显然是 - 通过全路径导入包:

  • github.com/username/repositorysublib1.go
  • github.com/username/repository/subliblib1.go

嗯,但是如果我将来改变路径怎么办?可能有更好的方法来导入内部包。我在sublib1.go 中导入github.com/username/repository 时遇到问题(我收到错误消息import cycle not allowed)。

我希望我已经解释得很好来回答这个问题。

【问题讨论】:

    标签: git go repository


    【解决方案1】:

    您不能在 Go 中进行循环导入,它们被明确禁止。您唯一的选择是重新考虑拆分包的方式,以免出现循环。

    【讨论】:

    • 好的,不允许的循环看起来是合乎逻辑的决定。但是示例中的 import sublib 呢?如何摆脱全名路径?
    【解决方案2】:

    import "github.com/username/repository/sublib" 是要走的路:正如我在“Is it possible don't specify package name?”中提到的,另一个“解决方案”是

    import "./sublib"
    

    如“Go language package structure”和“Golang how to import local packages without gopath?”中所述,这是使用相对路径,这不是一个好的做法。

    如果您将来更改路径,问题将与绝对或相对导入路径类似,但第一个(绝对)路径仍然被其他人“获取”。

    【讨论】:

      猜你喜欢
      • 2014-08-22
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多