我没有 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 中模块化您的代码、这样做的正确项目结构以及编译过程是如何工作的吗?
最佳答案
维基答案,请随意添加/编辑。
模块化
同一个包中的多个文件
- 听起来就是这样。同一个目录中的一堆文件都以相同的
package <name>
开头指令意味着它们被 Go 视为一大组代码。您可以透明地调用a.go
中的函数来自b.go
.这主要是为了代码组织的好处。 - 一个虚构的例子是一个“博客”包,其布局可能是
blog.go
(主文件),entry.go
, 和server.go
.由你决定。虽然您可以在一个大文件中编写博客包,但这往往会影响可读性。
- 听起来就是这样。同一个目录中的一堆文件都以相同的
多个包
- 标准库就是这样完成的。基本上,您创建模块并选择将它们安装到
$GOROOT
.你写的任何程序都可以import "<name>"
然后调用<name>.someFunction()
- 实际上,任何独立或共享的组件都应该编译成包。回到上面的博客包,如果要添加新闻提要,可以将 server.go 重构为一个包。然后两个
blog.go
和news.go
两者都会import "server"
.
- 标准库就是这样完成的。基本上,您创建模块并选择将它们安装到
编译
我目前将 gomake 与 Makefile 一起使用。 Go 安装附带了一些很棒的 make 包含文件,可以简化包或命令的创建。这并不难,掌握这些内容的最佳方法是查看来自开源项目的示例 makefile 并阅读 "How to Write Go Code" .
关于module - 模块化代码在 Go 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221463/