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

jef*_*r13 11 module packages projects-and-solutions compilation go

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

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

import foo
Run Code Online (Sandbox Code Playgroud)

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

from subfolder import foo
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过模块名称简单地引用它们来访问函数,例如y = foo.bar(y).这使得将逻辑代码片段彼此分离变得容易.


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

package foo
Run Code Online (Sandbox Code Playgroud)

在'foo'模块的顶部,然后您可以通过该模块导入

import (
        "foo"
              )
Run Code Online (Sandbox Code Playgroud)

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

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

ama*_*ttn 21

Wiki答案,请随时添加/编辑.

模块化

  1. 同一包中的多个文件

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

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

汇编

我目前使用gomake与Makefiles.Go安装附带了一些很棒的包含文件,可以简化包或命令的创建.这并不困难,最好的方法就是从开源项目中查看示例makefile并阅读"如何编写Go代码".