Module 模块化代码在Go中是如何工作的?
由于没有C/编译语言背景,我发现很难掌握使用Go的包机制来创建模块化代码 在Python中,要导入模块并访问其函数等等,只需Module 模块化代码在Go中是如何工作的?,module,compilation,packages,projects-and-solutions,go,Module,Compilation,Packages,Projects And Solutions,Go,由于没有C/编译语言背景,我发现很难掌握使用Go的包机制来创建模块化代码 在Python中,要导入模块并访问其函数等等,只需 import foo 其中foo.py是要导入到同一目录中的模块的名称。否则,您可以在子文件夹中添加一个空的\uuuu init\uuuu.py,并通过 from subfolder import foo 然后,只需通过模块名称引用函数即可访问函数,例如y=foo.bar(y)。这使得将逻辑代码片段彼此分离变得很容易 但是,在Go中,可以在源文件本身中指定包名,例如
import foo
其中foo.py是要导入到同一目录中的模块的名称。否则,您可以在子文件夹中添加一个空的\uuuu init\uuuu.py
,并通过
from subfolder import foo
然后,只需通过模块名称引用函数即可访问函数,例如y=foo.bar(y)
。这使得将逻辑代码片段彼此分离变得很容易
但是,在Go中,可以在源文件本身中指定包名,例如
package foo
在“foo”模块的顶部,您可以通过
import (
"foo"
)
然后通过它引用它,即y:=foo.Bar(x)
。但我无法理解的是这在实践中是如何运作的。golang.org上的相关文档似乎简洁明了,面向那些有更多使用makefiles和编译器经验的人
有人能清楚地解释一下你打算如何在Go中模块化你的代码,这样做的正确项目结构,以及编译过程是如何工作的吗?Wiki回答,请随意添加/编辑 模块化
- 这就是它听起来的样子。同一目录中的一组文件都以相同的
指令开头,这意味着它们被视为一大组代码。您可以从package
透明地调用b.go
中的函数。这主要是为了代码组织的利益李>a.go
- 一个虚构的例子是“blog”包可能与
(主文件)、blog.go
和entry.go
一起布局。这取决于你。虽然您可以在一个大文件中编写博客包,但这往往会影响可读性server.go
- 标准库就是这样做的。基本上,您可以创建模块并选择将其安装到
中。您编写的任何程序都可以$GOROOT
,然后调用导入“”
.someFunction()
- 实际上,任何独立或共享组件都应该编译成包。回到上面的blog包,如果您想添加新闻提要,可以重构server.go到一个包中。然后
和blog.go
都将news.go
导入“服务器”
我目前在Makefiles中使用gomake。Go安装附带了一些很棒的make包含文件,可以简化包或命令的创建。这并不难,最快了解这些内容的最好方法就是查看开源项目中的示例makefile并阅读。除了包组织,如python中的pip,使用dep进行包管理。如果您在现有的go软件包上使用它,它将自动构建依赖关系树,其中包含所有正在使用的软件包的版本。当切换到生产服务器时,dep Sure将使用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
我将用一个示例存储库的链接来回复,该示例存储库显示了这个漏洞交易的实际情况。希望这有点帮助。为我的github thingy的无耻的自我插件道歉,但这比在这里复制它要好。对于Go模块(Go 1.11中的新版本),许多相同的答案仍然适用,但对于Go模块,这稍微涵盖了这个问题。好的,这真的澄清了很多,谢谢!但是您是否必须为包中的每个文件重新声明导入?可能,但是编译器会告诉您何时缺少导入或不需要导入。