Module 模块化代码在Go中是如何工作的?

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中,可以在源文件本身中指定包名,例如

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

在Python中,要导入模块并访问其函数等等,只需

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模块,这稍微涵盖了这个问题。好的,这真的澄清了很多,谢谢!但是您是否必须为包中的每个文件重新声明导入?可能,但是编译器会告诉您何时缺少导入或不需要导入。