关于 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 友们有什么指点或建议吗

6126 次点击
所在节点    Go 编程语言
52 条回复
SimbaPeng
2023-07-25 13:18:33 +08:00
Oktfolio
2023-07-25 13:33:26 +08:00
踩 Java 的果然又来了
Desdemor
2023-07-25 13:54:59 +08:00
贴个老大的项目给你参考下: https://github.com/8treenet/freedom
ZGame
2023-07-25 14:22:54 +08:00
为了 d 而 d 没有意义吧... 而是要关注你的业务复杂度和前端可视化程度去做分类。不然一板一眼要累死
zuiwu
2023-07-25 15:16:47 +08:00
https://github.com/go-nunu/nunu
我用这个,感觉还不错,能满足自己开发需求即可
cosmtrek
2023-07-25 15:41:34 +08:00
注意分层和依赖控制,想怎么设计都行😂
darksword21
2023-07-25 16:47:11 +08:00
@sunhuawei 不错,还有 wire 和 i18n 顺便学习一下
houshuu
2023-07-25 17:43:19 +08:00
好的结构应该是没接触过项目的人一看就知道某个功能大概在哪里,而不是必须要 ide 找 defination 翻好多次。
组里有一些老的 go 项目 ddd 分的巨细,看起来巨累,改也不好改。有些很平的看上去文件多,其实很好理解,按照文件名把模块分开了,一眼就知道改哪里看哪里
lanlanye
2023-07-26 00:29:06 +08:00
1. ddd 没有明确代码结构,也不需要
2. go 语言写业务代码挺坐牢的,结构尽可能简单比较好
3. Java 那种组织代码的方式和 Go 导入包的方式有那么一点点冲突,写起来会不太舒服
4. 假设你使用 DDD 是为了处理大型项目,那我可以进一步假设这个大型项目会采用微服务,这种情况下代码里只需要一个聚合/服务就够了,外面加 1-N 个适配器
lanlanye
2023-07-26 00:31:40 +08:00
https://github.com/laipz8200/gin-template

顺便贴一下自己的,这套我最近没怎么维护了,而且直接把领域相关的内容全放在一个包下面也不见得好(但至少不会在导入时遇到重名),仅供参考
yrj
2023-07-26 07:42:43 +08:00
从个人理解的角度回答一下楼主,service 下面,文件和文件夹都可以,如果已经分了多个域,那么文件就够用了,否则也可以在 service 下放文件夹,总之复合自己业务的就是最好的,ddd 的思想是解耦和依赖倒置,参考楼上的洋葱图,因为他是为复杂项目设计的,所以楼主写简单项目的时候,会感觉有些“”啰嗦”。也可以看看我的帖子,我写的 go 开源项目,互相学习。
qloog
2023-07-26 10:07:55 +08:00
可以看下这个: https://github.com/go-eagle/eagle
业务代码基本都是在 internal 目录里

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

https://tanronggui.xyz/t/959430

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

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

© 2021 V2EX