当前位置: 首页 > 面试题库 >

布局Go项目的明智方法是什么

闻人嘉颖
2023-03-14
问题内容

我有一个go项目,这个项目开始变得越来越复杂,并且希望以减轻痛苦的方式布置文件系统

是否有一些很好的例子说明什么有意义?


问题答案:

2013年5月更新:官方文档位于“ 代码组织 ”部分

Go代码必须保存在 工作空间中
工作区是目录层次结构,其根目录包含三个目录:

  • src 包含归类为软件包的Go源文件(每个目录一个软件包),
  • pkg 包含包对象,并且
  • bin 包含可执行命令。

go tool构建源码包和安装产生的二进制文件的pkgbin目录。

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

用户可以使用省略号使用“ go get”安装“ adder”应用程序二进制文件:

$ go get github.com/benbjohnson/adder/...

瞧,您的用户已安装了“ adder”和“ adder-server”!

不要对子包发疯

通常,我项目的类型都非常相关,因此从可用性和API角度来看,它更适合。
这些类型还可以利用在它们之间调用未导出的优势,从而使API保持简洁。

  1. 在每个文件中将相关类型和代码分组在一起。如果您的类型和功能井井有条,那么我发现文件的大小通常在200至500
    SLOC之间。这听起来可能很多,但我发现它很容易导航。通常,单个文件的上限是1000 SLOC。
  2. 在文件顶部组织最重要的类型,并在文件底部添加重要性降低的类型。
  3. 一旦您的应用程序开始超过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:将资产分配到正确的位置并安装服务


 类似资料:
  • Standard project layout(标准的项目布局) 在 Loopback 根目录下有三个 子目录: server - Node 应用脚本和配置文件 client - 客户端 JavaScript, HTML, 和 CSS 文件. common - 文件共用客户端和服务器. 子目录 common/models 目录 包含所有模型JSON和JavaScript文件 definitions

  • 问题内容: 我已经阅读了一些文章,但没有得到实际的信息。有人可以向我解释。 仅与IE6相关吗? 这是什么? 是IE唯一的TAG吗? 编辑: 我发现此信息对我很有帮助 由于Internet Explorer很老(因为它是最早可用的浏览器之一),所以它没有像现在的浏览器那样重新启动。因此,随着时间的流逝,Microsoft开始改编新引擎以使用CSS。看起来不错……但是,CSS改变了Internet E

  • 以下是Maven Quickstart CLI创建的源代码的布局。 此外,这是标准Tapestry应用程序的建议布局。 ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradl

  • 表25.3.War插件-项目布局 文件夹 含义 src/main/webapp Web应用资源

  • Java 插件的默认布局如下图所示, 无论这些文件夹中有没有内容, Java 插件都会编译里面的内容, 并处理任何缺失的内容. 表22.4.java 插件-默认布局 目录 | 含义 —— | —- src/main/java | 主要 Java 源码 src/main/resources | 主要资源 src/test/java | 测试 Java 源码 src/test/resources |

  • 问题内容: SWT应用程序中Layout的用途是什么,因为我们可以在我们的应用程序中省略它。拥有它有什么好处? 问题答案: 自动布局比手动/绝对布局所需的时间更少。 首先,与绝对布局相比,总体上为具有所需属性的布局指定的工作更少。您可以快速添加,移动或删除自动布局中的项目,而无需调整所有其他项目的绝对位置。 接下来,这些因素有时使自动布局成为必要: 本地化:翻译后的标签可以更长或更短,需要调整布局