我正在寻找一个良好的项目组织,以进行多个用Go编写的组件的多平台项目。我从http://golang.org/doc/code.html知道了推荐的布局,但是那里建议的布局似乎不符合我的要求。

项目组件为:

  • 服务器(用Go编写)
  • 客户端,跨平台(Go)
  • 库,在服务器和客户端之间共享(Go)
  • 其他一些客户端(iOS,Android)

我的要求是:

  • 单个git存储库中的所有组件
  • 将组件分开(例如,每个组件一个目录)
  • Go组件可以被构造为多个子包

我目前的做法:

要构建,我使用一个Makefile,其中

  • 将lib /复制到服务器/和客户端/
  • 分别构建服务器/和客户端/,每次都将GOPATH设置到相应目录。
  • 它可以工作,但是感觉很笨拙,与推荐的代码布局完全不同。

    这是我正在考虑的替代方法:

    在这种布局下,我只有一个GOPATH(gospace /),不需要笨拙的Makefile。但是,这些组件没有像第一种方法那样整齐地分离(即通过顶层目录)。

    我的问题:哪种项目布局最适合我的需求以及Go约定和工具支持?有没有我没有看到的更好的选择?

    这就是我组织类似项目的方式:

    虽然大多数情况下以server/server.goclient/client.go作为package main应该可以工作,但最好将它们分开,以便可以将客户端/服务器嵌入其他项目中。

    回答这个问题已有很长时间了(关于OP的最新评论是2014年2月12日,而最新的回答是2014年4月16日)。当时我并没有进入Go的状态,只是在2018/19真正被介绍给Go了,但是看起来已经发生了很多变化。

    我认为,影响本文答案的最大变化是Go Modules。

    我的作品中有一个类似的项目(Go服务器,Go CLI,Android应用程序,iOS应用程序)。我当前正在使用go版本go1.13.7 darwin / amd64。这是我通过Go Modules附带的结构(受Ben Johnson的这篇文章影响很大):

    根目录位于GOPATH之外,并包含必需的go.modgo.sum文件。 domaintypes.go文件是为了说明我在根目录中剩下的唯一Go文件是永远不会导入其他内容的代码-例如定义您的域类型/模型/服务接口/等。我个人有多个:user.gogroup.go

    postgreshttp目录是我编写的库,它们都是分层适配器。每个库目录都应隔离到其域。例如HTTP路由不应直接与数据库连接交互。

    cmd目录是所有可执行Go代码都应该存在的目录。我想要一个API服务器和一个单独的CLI,所以这就是它的住所。这些文件应保持较小,并调用您编写的所有其他库。

    对于非Go代码,我只是在Android和iOS的根目录中创建了单独的目录。