关于 Go Web 项目的项目结构

2023-07-25 10:00:15 +08:00
 gitrebase

想搞 DDD ,但自觉无能,就借鉴了一下 DDD 的分层思想,搞出了如下的结构

├── adaptor
│   ├── mq
│   ├── rpc
│   ├── task // 定时任务
│   └── web
├── config
├── handler
│   └── user.go
├── infrastructure
│   ├── cache
│   │   └── user.go
│   ├── message
│   ├── mp
│   ├── remote
│   └── repository
│       └── user.go
├── main.go
├── manager
│   └── user.go
├── model
│   ├── bo
│   ├── dto
│   ├── po
│   └── vo
└── service
    ├── event // 事件总线(事件模型)
    └── user.go

但还是感觉不是很对?

比如 service 下,如果 user.go 、post.go 等不同模块的都放在一个 service 包下,那这个 service 包的内聚性堪忧;如果 service 下各建子包,那命名上感觉又有点奇怪(比如路径是 service/user ,但是 package 如果是 user 就可能和 handler 、repository 等包下面的 user 重复了,如果是 userservice 又感觉看着好怪?)

想问问万能的 V 友们有什么指点或建议吗

6014 次点击
所在节点    Go 编程语言
52 条回复
sunhuawei
2023-07-25 10:38:52 +08:00
贴一个我喜欢的 Go 项目的结构,作者也曾在 v 站发过贴,我的项目也都用的这种结构
https://github.com/answerdev/answer
tcpdump
2023-07-25 10:39:22 +08:00
Java 各种 *AO ,GO 各种 func

还是 Python 看得舒服
xuelu520
2023-07-25 10:39:31 +08:00
什么语言,项目结构的归属都是 JAVA 向的。所以直接抄 java 吧,免得后面还得改
loading
2023-07-25 10:42:01 +08:00
https://github.com/flipped-aurora/gin-vue-admin
感觉挺合理的,前后端都有。
gitrebase
2023-07-25 10:42:50 +08:00
@weiwenhao 感谢佬的解答!此外还有点疑惑

1. 关于 [controller 排版有问题, 应该是 controller/user/user.go . 也就是一个模块一个 package] ,想问下该怎么设置 controller/user 的 package name 呢,如果就默认为 user ,感觉有可能会和 service/user 等其他的同名模块冲突?

2. 关于 [访问的层级关系需要严格限定] ,会不会出现 service 互调导致循环引用的场景呢?之前写 Java 的使用用的是 Manager 下沉,service 调度 manager ,在 Go 里有什么方案吗
gitrebase
2023-07-25 10:45:34 +08:00
@crysislinux 我之前也没用过这样的结构,但是看网上有些类似这样的图( https://image-static.segmentfault.com/219/409/2194092392-357c41e63032335e ),把 db 归到了 infra 中
gitrebase
2023-07-25 10:47:51 +08:00
@sunhuawei 感谢推荐,这就学习学习
weiwenhao
2023-07-25 10:50:01 +08:00
@gitrebase

1. 就叫 package user, 如果冲突就 import userservice "service/user" 就可以了. 没啥不雅的吧
2. 假如 service 互相引用就说明存在共同逻辑呗, 如果是和 model 相关的就下沉到 model, 如果是通用的业务逻辑就下沉到 util, 如果都不是, 我就继续在 service 单独起一个目录来建. 实际编写过程中, 我一般不会直接创建 service, 需要复杂逻辑时才会提取到 service 里面. 否则基本都在 model 中写了.

3. 这个不是 golang 的方案, 就是我自己的总结学习的方案. 原则上遵循瘦 controller, 胖 model, 如果 model 太胖了,才会提取一个 service package.
gitrebase
2023-07-25 10:54:47 +08:00
@weiwenhao 感谢佬的回复!收益颇丰!
xz410236056
2023-07-25 10:55:32 +08:00
等你构建好完美的文件夹时,我功能都写完了
pkoukk
2023-07-25 10:56:59 +08:00
https://github.com/danceyoung/paper-code/blob/master/package-style-guideline/packagestyleguideline.md
https://github.com/danceyoung/paper-code/blob/master/package-oriented-design/packageorienteddesign.md

我的建议是不要追求什么 best practice ,结合良好的规范和个人需求,制定适合自己的架构就好。
抄一个架构下来,里面一大堆文件夹是空的,有什么意义呢?或者为了一行代码套了三层文件夹,引用维护起来蛋疼的要死,何必呢?
crysislinux
2023-07-25 10:59:59 +08:00
@gitrebase DB 确实是 infra ,但是那是指 DB 本身。repository 是具体的仓库了,它不一定从狭义的 DB 获取数据
gitrebase
2023-07-25 11:04:53 +08:00
@crysislinux 理解了,谢谢佬!
hijoker
2023-07-25 12:21:35 +08:00
很多 Go 的开源项目的结构可以参考下。比如 k8s 相关的,我也赞成不要照搬目录结构
imMetaverse
2023-07-25 12:34:37 +08:00
什么时候踩 Java 又成为一种时尚了 😭
wxlwsy
2023-07-25 12:43:46 +08:00
java 本来好好的直到遇到了 j2ee, 看来 go 也逃不了这种命运...
amon
2023-07-25 12:46:25 +08:00
这种没有标准的规范,每个公司和团队场景不同、风格也不同。
参考开源项目是一个好办法。
然后在实际使用的过程中,遇到划分不合理的情况再作优化。
SimbaPeng
2023-07-25 13:11:16 +08:00
Cola98
2023-07-25 13:11:29 +08:00
之前写的一个帖子,可以参考下:
https://v2ex.com/t/865330#reply27
cexll
2023-07-25 13:11:30 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/959430

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX