【问题标题】:using libraries in Golang在 Golang 中使用库
【发布时间】:2015-05-14 09:22:45
【问题描述】:

首先要明确的是,我来自 Java 世界,并且我一直在进行编程,我真的很喜欢它。

我有一个关于打包系统和导入的小问题,如果我正在导入一个使用另一个库的库并且我已经在我的项目中使用该库,我该如何消除重复(如果可能的话),

换句话说: A是主程序,C和B是库,然后: C被添加到A B 使用 C

然后 B 也被添加到 A

AProject/
    src/
        LibC/
            src/
                somefiles.go
        LibB/
            src/
                LibC
                somefiles.go
        app.go

所以现在我有两个 C 库,一个在 A 中,一个在 B 中,因为 B 依赖于 C。

我知道这有点令人困惑,但在 Java 世界中,我们拥有 Ant 和 Maven,而这些构建工具让我们能够非常轻松地处理依赖关系。

有什么想法吗?

【问题讨论】:

    标签: go dependencies packages


    【解决方案1】:

    在 Go 中,没有重复的包。

    首先,您应该阅读 How to Write Go Code 中有关 Go 工作区的信息。

    根据您的问题,您的目录结构应如下所示:

    gopath (gopath is the path of a directory in your $GOPATH list)
    ├── bin
    │   └── projecta
    ├── pkg
    │   └── linux_amd64
    │       └── projecta
    │           ├── libb.a
    │           └── libc.a
    └── src
        └── projecta
            ├── a.go
            ├── libb
            │   └── b.go
            └── libc
                └── c.go
    

    在哪里,

    gopath/src/projecta/a.go:

    package main
    
    import (
        "projecta/libb"
        "projecta/libc"
    )
    
    func a() {
        libb.B()
        libc.C()
    }
    
    func main() { a() }
    

    gopath/src/projecta/libb/b.go:

    package libb
    
    import (
        "projecta/libc"
    )
    
    func B() { libc.C() }
    

    gopath/src/projecta/libc/c.go:

    package libc
    
    func C() {}
    

    【讨论】:

    • 相信我,我知道结构,但想象一下我没有使用 LibB,我正在使用 LibC,一切都很好,然后我的项目有了一个新的用例,我需要去获取 LibB,然后 LibB(这是 git hub 上的一个公共库,让我们说)它隐式使用 LibC,因为 LibC 提供了一些功能,没问题,我想在我的项目中使用 LibB 和 LibC,现在我有可能: 1-删除LibC并从LibB间接使用它。 2-保留它,然后我会复制一个库,对吗?
    • 导入的包(在这个例子中是 LibC)只会在你编译的 Go 可执行文件中出现一次,并且在你的 $GOPATH/src/github.com/LibC 存档中出现一次。您可以在任意数量的实现模块中导入该第 3 方包,只有一个已编译对象的实例将添加到您的最终可执行 Go 程序中。
    • 谢谢 这就是我需要听到的全部内容,这个小通知,将出现一次,问题是我对将所有资源文件视为我使用的库的代码感到不舒服到 jars (因为我来自 Java 背景)这就是为什么这对我来说有点奇怪,但是是的,这就是 go 中的工作方式并且它足够公平
    【解决方案2】:

    如果你在谈论第三方库,在 go 中很容易做到这一点, 只需将导入放在您的源代码中,例如:

    import "github.com/somepackage/somelib"
    

    并从工作目录中的命令行运行:

    go get
    

    这些库的源代码将下载到您的 $GOPATH 的 src 目录中。 如果您想创建自己的 lib,只需在 $GOPATH/src 中创建名为 lib 的文件夹,然后将代码放在此文件夹中即可。

    文件夹结构为:

    $GOPATH/
    src/
        github.com/
            somepackage/
                somelib/
                    somelib.go
        yourlibB/
            yourlibB.go -> //import somelib here
        yourlibC/
            yourlibC.go -> //import libB here
        yourmainprogramA/
            yourmainprogramA.go -> //import somelib, libC and libB here
    

    【讨论】:

    • 但这不是我需要的,我知道如何构建您的代码,但我要说的是如何删除库的重复,而不是如何获取该库,我不知道需要运行 go git,因为我使用的是 IntelliJ Idea,我可以自动获取任何库
    • 对不起,我不明白你在说什么重复,当你构建时,如果你需要一个库,它将被包含一次,即使它包含在每个源和库中
    • 好吧,看看你的例子,你的libB是一个使用libc的包,所以暂时忘掉项目,只看libB,所以在Lib BI中会有这样的结构:libB/src/gofiles。 go , libC Project A -> src-> libC,lbB,somgofiles.go 这是结构
    • 你的例子是错误的,src 必须是所有的根目录,导入的库都放在你的 GOPATH/src 文件夹中。在您的示例路径中,libB 和 libC 被假定为单独的 GOPATH,而不是 GOPATH/src/libB 和 GOPATH/src/libC
    • @user2422033 如果您坚持使用非标准(和损坏的)工作区布局,那么您只能靠自己了,您不应该期待标准工具的帮助。在 Go 中,唯一的包应该有一个唯一的位置和一个唯一的导入路径,然后一切都按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多