模块化代码如何在Go中运行?

时间:2011-08-28 14:09:24

标签: module compilation packages projects-and-solutions go

没有来自C /编译语言的背景,我发现很难掌握使用Go的包机制来创建模块化代码。

在Python中,要导入模块并访问它的函数等等,这是一个简单的例子

import foo

其中foo.py是要在同一目录中导入的模块的名称。否则,您可以将空__init__.py添加到子文件夹中,并通过

访问模块
from subfolder import foo

然后,您只需通过模块名称引用功能即可访问这些功能,例如: y = foo.bar(y)。这样可以轻松地将逻辑代码段彼此分开。


在Go中,您可以在源文件本身中指定包名称,例如

package foo

位于'foo'模块的顶部,然后可以通过

导入
import (
        "foo"
              )

然后通过它来引用它,即y := foo.Bar(x)。但是我无法理解的是这在实践中是如何运作的。 golang.org上的相关文档似乎很简洁,并且针对使用makefile和编译器的人有更多(任何)经验。

有人可以清楚地解释一下你是如何在Go中模块化你的代码,这样做的正确的项目结构,以及编译过程是如何工作的?

2 个答案:

答案 0 :(得分:21)

Wiki回答,请随时添加/编辑。

模块化

  1. 同一个包中的多个文件

    • 这就是听起来的样子。同一目录中的一堆文件都以相同的package <name>指令开头,这意味着它们被Go视为一大组代码。您可以从a.go透明地调用b.go中的函数。这主要是为了代码组织的利益。
    • 虚构的示例可能是“博客”包可能与blog.go(主文件),entry.goserver.go一起列出。由你决定。虽然您可以在一个大文件中编写博客包,但这往往会影响可读性。
  2. 多个包

    • 标准库以这种方式完成。基本上,您创建模块并可选择将它们安装到$GOROOT中。您编写的任何程序都可以import "<name>",然后拨打<name>.someFunction()
    • 实际上,任何独立或共享组件都应编译到包中。回到上面的博客包,如果你想添加新闻源,你可以将server.go重构为一个包。然后,blog.gonews.go都会import "server"
  3. 汇编

    我目前使用gomake和Makefile。 Go安装附带了一些很棒的包含文件,可以简化包或命令的创建。这并不困难,最好的方法就是从开源项目中查看示例makefile并阅读"How to Write Go Code"

答案 1 :(得分:0)

除了软件包的组织之外,就像python中的pip一样,请使用dep https://github.com/golang/dep进行软件包管理。如果在现有的go软件包上使用它,它将自动使用所有正在使用的软件包的版本来构建依赖关系树。转移到生产服务器时,dep确保将使用Gopkg.toml安装所有必需的软件包。
只需使用dep sure -add,其他用于dep的命令是:

Commands:

    init     Set up a new Go project, or migrate an existing one
    status   Report the status of the project's dependencies
    ensure   Ensure a dependency is safely vendored in the project
    version  Show the dep version information
    check    Check if imports, Gopkg.toml, and Gopkg.lock are in sync

 Examples:
    dep init                               set up a new project
    dep ensure                             install the project's dependencies
    dep ensure -update                     update the locked versions of all dependencies
    dep ensure -add github.com/pkg/errors  add a dependency to the project