Answers:
2013年5月更新:官方文档位于“ 代码组织 ”部分
Go代码必须保存在工作空间中。
工作空间是目录层次结构,其根目录包含三个目录:
src 包含归类为软件包的Go源文件(每个目录一个软件包),pkg 包含包对象,并且bin 包含可执行命令。在
go tool构建源码包和安装产生的二进制文件的pkg和bin目录。该
src子目录通常包含跟踪一个或多个源的包的发展多个版本控制储存库(诸如用于GIT中或水银)。
bin/
    streak                         # command executable
    todo                           # command executable
pkg/
    linux_amd64/
        code.google.com/p/goauth2/
            oauth.a                # package object
        github.com/nf/todo/
            task.a                 # package object
src/
    code.google.com/p/goauth2/
        .hg/                       # mercurial repository metadata
        oauth/
            oauth.go               # package source
            oauth_test.go          # test source
2014年7月更新:请参见Ben Johnson的 “ 在Go中构建应用程序 ”
该文章包括如下技巧:
将
main.go文件和我的应用程序逻辑合并到同一程序包中将产生两个结果:
- 它使我的应用程序无法用作库。
 - 我只能有一个应用程序二进制文件。
 我发现解决此问题的最佳方法是
cmd在项目中仅使用“ ”目录,其中每个子目录均为应用程序二进制文件。
camlistore/
  cmd/
    camget/
      main.go
    cammount/
      main.go
    camput/
      main.go
    camtool/
      main.go
将
main.go文件移出根目录后,您可以从库的角度构建应用程序。您的应用程序二进制文件只是您的应用程序库的客户端。有时,您可能希望用户以多种方式进行交互,因此您需要创建多个二进制文件。
例如,如果您有一个adder允许用户将数字加在一起的“ ”软件包,则可能要发布命令行版本和Web版本。
您可以通过这样组织项目来轻松地做到这一点:
adder/
  adder.go
  cmd/
    adder/
      main.go
    adder-server/
      main.go
用户可以使用省略号将您的“ adder”应用程序二进制文件与“ go get”一起安装:
$ go get github.com/benbjohnson/adder/...
瞧,您的用户已经安装了“
adder”和“adder-server”!
通常,我项目的类型都非常相关,因此从可用性和API角度来看,它更适合。
这些类型还可以利用在它们之间调用未导出的优势,从而使API保持简洁。
- 在每个文件中将相关类型和代码分组在一起。如果您的类型和功能井井有条,那么我发现文件的大小通常在200至500 SLOC之间。这听起来可能很多,但我发现它很容易导航。通常,单个文件的上限是1000 SLOC。
 - 在文件顶部组织最重要的类型,并在文件底部添加重要性降低的类型。
 - 一旦您的应用程序开始超过10,000 SLOC,您应该认真评估它是否可以分解为较小的项目。
 
注意:最后的实践并不总是很好:
对不起,我不同意这种做法。
将类型分隔为文件有助于代码管理,可读性,可维护性和可测试性。
它也可以确保单一责任并遵循开放/封闭原则……
不允许循环依赖的规则是迫使我们对软件包有一个清晰的结构。
(或者,src仅在2013年2月提供),
您可以在“ GitHub代码布局 ”中找到经典布局:
该应用程序和两个库都位于Github上,每个库都位于自己的存储库中。
$GOPATH是项目的根-每个Github仓库都会在下面的几个文件夹中签出$GOPATH。您的代码布局如下所示:
$GOPATH/
    src/
        github.com/
            jmcvetta/
                useless/
                    .git/
                    useless.go
                    useless_test.go
                    README.md
                uselessd/
                    .git/
                    uselessd.go
                    uselessd_test.go
                    README.md
下面的每个文件夹
src/github.com/jmcvetta/都是单独的git checkout的根。
但是,在此reddit页面中,这引起了一些批评:
我强烈建议您不要按照自己的方式来构造存储库,否则会破坏“
go get”,这是Go最有用的功能之一。
为确实了解Go的人编写代码要好得多,因为他们很可能是编译它的人。
对于那些没有的人,他们至少会对这种语言有所了解。将主包放在仓库的根目录中。
将资产放在子目录中(以保持整洁)。
将代码的内容保留在子包中(以防任何人想在您的二进制文件之外重用它)。
在回购的根目录中包含一个安装脚本,因此很容易找到。下载,构建,安装和设置仍然只有两个步骤:
- “
 go get <your repo path>”:下载并安装go代码,其中包含资产的子目录$GOPATH/<your repo path>/setup.sh:将资产分配到正确的位置并安装服务
我认为对于“项目”,您并不是指Go软件包,而是您开发的软件。否则,您可以在这里和这里获得帮助。但是,为Go编写程序包并没有什么不同:使用程序包,为每个程序包创建一个文件夹,然后将这些程序包合并到应用程序中。
为了建立自己的见解,您可以在github上查看流行的Go存储库:https : //github.com/trending/go。凯莱 和宙斯就是著名的例子。
最受欢迎的方案可能是在其自己的目录中具有主Go文件以及许多模块和子模块。如果您有许多元文件(文档,许可证,模板等),则可能需要将源代码放入子目录中。到目前为止,这就是我所做的。
$GOPATH/src或使用他们的go get-表名。
                    doozerd这不是一个好例子,即使它的测试也很薄弱。
                    您可能还应该查看此存储库。它显示了很多如何构造go应用程序的想法:https : //github.com/golang-standards/project-layout
setup.sh是Go合理地跨平台,而POSIX shell脚本不是。