在 Golang 中使用库

using libraries in Golang

首先要明确的是,我来自 Java 世界,我已经在 go 上编程了一段时间,我真的很喜欢它。

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

换句话说: 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 中很容易做到, 只需将导入放入您的源代码中,例如:

import "github.com/somepackage/somelib"

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

go get

库的源代码将下载到 $GOPATH 的 src 目录中。 如果您想创建自己的库,只需在 $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 中,没有重复的包。

首先,您应该阅读 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() {}