没有来自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中模块化你的代码,这样做的正确的项目结构,以及编译过程是如何工作的?
答案 0 :(得分:21)
Wiki回答,请随时添加/编辑。
同一个包中的多个文件
package <name>
指令开头,这意味着它们被Go视为一大组代码。您可以从a.go
透明地调用b.go
中的函数。这主要是为了代码组织的利益。 blog.go
(主文件),entry.go
和server.go
一起列出。由你决定。虽然您可以在一个大文件中编写博客包,但这往往会影响可读性。多个包
$GOROOT
中。您编写的任何程序都可以import "<name>"
,然后拨打<name>.someFunction()
blog.go
和news.go
都会import "server"
。我目前使用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