Web 应用程序的 Go Lang 文件夹结构

man*_*rie 5 design-patterns go

如您所知,在我看来,Go 是 OOP 的一种现代方法,具有一些出色的功能,例如强制您使用组合而不是继承。我只是想了解如何根据文件夹和包结构来设计编写良好的 Go 代码。

我只是想知道这种类似于 React 的方法(如下所示)是否可以工作?将应用程序作为组件划分到不同的包中?

或者您能给我一个关于 Web api 的文件夹/打包的良好结构的示例、链接和想法吗?Go 只是我的开源项目后台的一个 api,顺便说一句,在客户端我计划有一个单页 React 应用程序。

多谢,

在此输入图像描述

Bij*_*jan 13

标准 Go 项目布局

GitHub 上有一个拥有很多 star 的 Repo(截至撰写本文时有 22k)。这种方法实际上相当完整,但对于较小的项目来说可能有点过头了。

https://github.com/golang-standards/project-layout

Go 目录(基础)

文件夹 描述
/命令 该项目的主要应用。
/内部的 私有应用程序和库代码。
/包 可供外部应用程序使用的库代码。
/小贩 应用程序依赖项(手动管理或通过您最喜欢的依赖项管理工具(例如新的内置 Go Modules 功能)进行管理)。

服务应用目录

文件夹 描述
/api OpenAPI/Swagger 规范、JSON 模式文件、协议定义文件。

Web 应用程序目录

文件夹 描述
/网络 Web 应用程序特定组件:静态 Web 资产、服务器端模板和 SPA。

通用应用程序目录

文件夹 描述
/配置 配置文件模板或默认配置。
/在里面 系统 init(systemd、upstart、sysv)和进程管理器/主管(runit、supervisord)配置。
/脚本 用于执行各种构建、安装、分析等操作的脚本。
/建造 打包和持续集成。
/部署 IaaS、PaaS、系统和容器编排部署配置和模板。
/测试 其他外部测试应用程序和测试数据。

其他目录

文件夹 描述
/文档 设计和用户文档(除了 godoc 生成的文档之外)。
/工具 该项目的支持工具。
/例子 您的应用程序和/或公共库的示例。
/第三者 外部帮助工具、分叉代码和其他第 3 方实用程序(例如 Swagger UI)。
/githooks Git 挂钩。
/资产 与您的存储库一起使用的其他资产(图像、徽标等)。
/网站 如果您不使用 GitHub 页面,则可以在此处放置项目的网站数据。


Dav*_*rth 6

我倾向于将我的应用程序构建为: $GOPATH/github.com/yourname/projectname/ cmd/ app1/ main.go app2/ main.go db/ 001_initial_schema.sql 002_add_timestamps.sql ... etc ... lib/ lib1/ lib2/ html/ ..all the html stuff.. 其中 app1 / app2 是命令行应用程序。通常它只是一个应用程序(您的网络服务器)。

lib/* 就是您拥有的任何隔离的功能部分。

通常,我从 cmd/app1 开始,然后当项目变得足够复杂时扩展到 lib。

并创建你的静态文件服务器(假设你有一个),使用“html”作为目录。

对于数据库迁移,我使用我编写的一个非常简单的迁移器,因为我发现其他迁移器太复杂/太大。

这是我在项目中使用的代码。
我想过让它成为一个真正的库,但我很确定这是 postgresql 特定的,因为它假设 DDL 是事务性的。

使用这种结构,您可以简单地执行以下操作(从项目根目录):

go install ./... && app1

构建/测试您的应用程序。

如果您想部署到 Heroku,因为 Heroku 将工作目录设置为项目根目录,那么这种结构也自然会起作用。