我是从一线开发转行到国企做信息化项目管理,朝九晚五,上班基本就是我去 ZF 那边挨骂,然后我转头去骂外包商,基本没什么事。但是我一直放不下自己的技术情节,Java 写了 10 年也腻了,就想用 golang 自己写点东西玩。
我最近尝试用 golang 写一些 web 小玩意儿,但是我很难在网上找到一个适合小项目的项目结构,AI 给的也是大型化的结构。我用 fiber 和 gorm ,viper 做配置文件解析。gorm 的事务管理也比较懵,我都是 cursor 生成。
请各位针对我只搞小玩意儿的诉求,指点一个 mini 的项目结构,推荐技术选型,指点一下 gorm 的事务控制。
1
root71370 3 天前
放下 java 思想
|
![]() |
2
xxmaqzas 3 天前
gf 不行么?
|
![]() |
4
laikick 3 天前
不过小项目根本没啥必要纠结项目结构.
|
5
layxy 3 天前 ![]() Kratos 的工程结构可以参考下,虽然是 rpc 框架,但是你写 web 也可以
|
![]() |
6
lesismal 3 天前 ![]() @laikick golang-standards/project-layout 这个根本不算是好的结构:
而且这个 repo 作者可以算是 go 社区里最不要脸的了,我都不敢用“最不要脸的之一”来描述他、怕“之一”不准确: https://github.com/golang-standards/project-layout/issues/117 请做个好人,不要再向别人推荐这个带来更多误导。 |
8
Ayanokouji 3 天前 ![]() |
![]() |
10
wogogoing 3 天前
|
12
sn0wdr1am 3 天前
|
![]() |
13
loveuer 3 天前
如果是 web 后端的话,我自己有搞一个 https://gitea.loveuer.com/loveuer/ultone
|
![]() |
14
laikick 3 天前
@sn0wdr1am golang-standards/project-layout 这个根本不算是好的结构:
而且这个 repo 作者可以算是 go 社区里最不要脸的了,我都不敢用“最不要脸的之一”来描述他、怕“之一”不准确: https://github.com/golang-standards/project-layout/issues/117 请做个好人,不要再向别人推荐这个带来更多误导。 |
![]() |
15
voidmnwzp 3 天前 via iPhone
建议换个用 golang 的公司
|
![]() |
16
mengzhuo 3 天前 ![]() |
![]() |
18
lasuar 3 天前 ![]() 有技术情节,咋个连有文档的 gorm 事务都搞不定?怎么个事儿
|
![]() |
20
body007 3 天前 ![]() 把 gf 官方文档看完,只用 gf 一个库就行。
|
![]() |
21
wkong 3 天前
你这样一问,我必须推荐下自己的开源项目: https://github.com/WuKongIM/WuKongIM
|
![]() |
22
wkong 3 天前
Go 写 CRUD 可能不如 Java ,写 IM 还是很爽。
|
![]() |
23
MagicLi 3 天前
Java 推荐这个啦,https://goframe.org/ ,其他的慢慢来,找其他优秀项目来参考。
|
![]() |
24
Hilalum 3 天前 ![]() 别骂外包,对外包好点
|
![]() |
25
R0sin 3 天前
用过 v 友推荐的 https://github.com/go-nunu/nunu
个人感觉用于学习和快速开发都还不错 |
26
strobber16 3 天前 via Android
gorm bug 血多,建议别用
|
![]() |
27
pkoukk 3 天前 ![]() 我建议你看一眼 prometheus 的源码: https://github.com/prometheus/prometheus
上面哪个项目代码质量能比 prometheus 好? 懂了么?根据你的项目而定,想怎么摆怎么摆,go 没那么多限制 |
28
sakurawzt 3 天前
和我一样,我也想写个 go 的项目,最后发现没有适合的项目结构,没有和 springboot 这样一统江湖的存在。
|
![]() |
29
gufeng311 3 天前
小项目直接平铺就行了,你就是想得太多
|
30
ninjashixuan 3 天前
加点 internal 以及注意避免循环依赖,剩下的根据业务自己发挥了。
|
32
thisisgpy OP @strobber16 我也用过 sqlx 。习惯于 java 的 mybatis ,其实都不太习惯。你有更好的推荐吗?
|
33
Jinnrry 3 天前
@strobber16 然而事实就是除了 grom ,每一个能打的。什么 sqlx 、xorm ,功能上根本就不如 gorm
|
![]() |
34
Nazz 3 天前
建议使用全局变量, 显式控制服务加载顺序避免依赖循环, 路由和请求处理, 输入输出定义, 业务逻辑放一个包内
|
![]() |
35
Nazz 3 天前
路由框架就用 gin
|
36
lysShub 3 天前
我去 50k 的星星,绝对是刷的
|
![]() |
37
biu7 3 天前
快教教我们怎么去国企做信息化项目管理,工资咋样?(项目结构用 kratos 或者 gf 的就行)
|
![]() |
38
biu7 3 天前
话说这么多层楼,orm 没有一个用 ent 的吗?
|
![]() |
39
gitrebase 3 天前
在 Go “使用 struct 或 func 需要加上 package 包名前缀”的前提下,建议扁平化组织结构:即以一个领域为一个 package ,将各个文件**扁平地**分布在这个文件夹下(没必要就不需要加第二层文件夹)
|
![]() |
40
qloog 3 天前
|
![]() |
41
wangritian 3 天前
goframe 不错很多人推荐了,小项目建议只分 controller service model 三层
|
![]() |
42
zhoujx 3 天前
你写的代码量有多少?很复杂吗?如果只是玩玩的,直接不用分目录了,直接干
|
![]() |
43
zhoujx 3 天前
先平铺,以后项目大了再找个合适的框架再调整就行了
|
45
bulo 3 天前
工作十年还在纠结语言??
|
47
fxjson 2 天前
https://github.com/fanqingxuan/go-gin, 我自己用 gin+gorm+go-redis 库开发的一个开箱即用框架,个人感觉比较适合小项目
|
48
bug123 2 天前
写了十几年 golang ,都是一把梭哈
- view -- base -- ... - static -- js -- css -- ... - controller -- ... - utils -- ... main.go run.sh ... |
49
thisisgpy OP @bulo 我是不再依靠写代码维生,也没太多兴致去探索技术。现在只是还有一点情怀,想着方便自己,做点小东西,所以看 golang 简洁,就想着拿来用。至于说帖子的主题,其实也是没有从 java 复杂的项目结构思维中脱离出来,所以来提问寻求指点。
|
51
strobber16 2 天前 via Android
@thisisgpy 没有,建议放弃 orm ,用标准库 sql
|
52
xfurther01 2 天前
https://github.com/zeromicro/go-zero
这个国内的开源项目,基本上和我现在公司自研的一套在思想上大同小异 |
53
qq1340691923 2 天前
如果不忙的话并且想学 go 的话,可以用 go 给 ElasticView 写插件,插件模板工程地址: https://github.com/1340691923/eve-plugin-vue3-template
|
54
durban126 2 天前
|
![]() |
55
Felldeadbird 2 天前 ![]() 写 go 把 go 当成面向过程,全是在调用函数 就没那么大负担了。
gorm 事务不是很简单吗。跟着文档声明就好了。 |
56
extrem 2 天前
理解你的想法,但是建议你多想想为什么要这么做
就是说,要写代码直接去写就好了,不是一定遵循什么“项目结构”才能写,如果说项目到了那个地步你自然不会再纠结这个问题 另外,别用 gorm ,直接用最原始的 sql 拓展如 sqlx |
![]() |
57
linyuyizhizou 2 天前
建议学学 Rails 。
|
![]() |
58
CinHaiZio 2 天前
pkg 放公用, 框架 初始化方法, 工具类, 配置, app 放业务逻辑, 什么 ctrl,service 可以塞这,其他玩意也可以塞这, app/cmd 放启动的,
完啦, 加个 script, config, resource, 加个 deploy 放 nginx.conf,dockercompose 模块化就/app/{module}/cmd/main.go 咯 |
59
kevinpendragon 2 天前
其实大佬写小项目也是一把梭。。。结构本身不是很值得纠结的东西
|
62
crackidz 2 天前
你已经用 cursor 了,直接问 cursor 啊...
|
![]() |
64
javalaw2010 2 天前
go 没有什么标准的项目结构,假设你的项目足够小,一个 main.go 就足以了。go 这玩意儿主打的就是一个随心所欲,爱咋咋地。
|
![]() |
65
asen001 2 天前
看过很多开源的 web 项目,挺多都是直接在 controller 中梭哈
|
![]() |
66
4Et5ShxMIq58n6Lr 2 天前
之前社区发过一个悟空聊天的 IM 项目,他的服务端你可以看看,个人感觉挺好懂的,我自己写的小项目就是复制他的结构,
|
67
zxjxzj9 2 天前
足够小的话 controller 梭哈都可以。想要一点正经项目的,我的理解就是把路由(面相 http 的部分),逻辑处理和面相数据库的部分分三个包出来各管各的就可以了。 简单来说 gorm 层就负责 crud ,controller (或者其他 any 叫法)就负责把你的从数据库里的东西变成你要丢给 http 的形式,然后用框架的路由层负责把这坨东西丢回去。
|
![]() |
68
godiu 2 天前
我也在找,之前论坛也有个推荐贴。go-frame eagle go-web-template go-laravel ,go-hertz ,好多个,我都试了下,结果正经代码一行没写,全在试框架。
我的要求比较零散,gin ,sql 最好用 gorm ,接口能方便加中间件,封装层级不要太多。这样我可以方便那里做 web 的小项目。代码生成可有可无。 很多都是封装太复杂了,写一个接口好多定义。 |
![]() |
69
ldyisbest 2 天前
|
70
jarytom 2 天前
gin-vue-admin
|
![]() |
71
zgcwkj 2 天前
|
![]() |
72
noyidoit 2 天前
几十个函数几千行的小玩意你全都写在 main.go 里面都行,想稍微讲究点就接着搞 MVC 那套,小项目去掉 service 只留 controller 和 model 。至于事务控制,gorm 的事务挺简单的,不知道你想问什么
|
![]() |
74
vegetableChick 2 天前
@laikick 用这 B 头像,这是好事儿啊!
|
75
sthwrong 2 天前
没有标准,注意循环引用问题,注意是否有内部包要求,其他的只要满足需求随便搞。至于框架,本质就是路由管理,也以满足需求为准,比如是否方便生成相对标准的文档,有这需求可以用 go-zero ,goframe 等这些进行了一定规范设计的框架,要么就 gin,fiber 之类的接近只有路由功能的组装其他库自撸。
|
![]() |
76
JKeita 2 天前
小东西,自己怎么舒服怎么来就行了。
|
![]() |
77
cumt21g 2 天前
直接看看 K8s 及其相关项目的项目结构
|
79
Akkuman 2 天前 via Android
说说我目前在用的,我目前用的大多是代码生成式的,不过也有点难受
首先我会拿 postman 等工具先定义好接口到处 openapi 文档 entgo:orm 生成 ogen:根据 openapi 文档生成代码 好处是预先生成了大量样板代码,缺点也是这个,导致一些比较高阶的自定义操作需要对库有比较深的了解 |
![]() |
80
dog82 2 天前
现在最应该学 python ,不过啥语言都差不多哈
|
81
coderzhangsan 2 天前 ![]() 好多转 go 的人,会把母语的思想带入进来,例如 java/php ,封装 go 框架和库,基本都是围绕之前框架设计思想来的,用 oop 去写 go 代码,跟 go 语言设计是相违背的,写起来怪怪的,不过有一点,面向工作或工资编程,这么做也没什么不对的😂。
|
![]() |
82
loveuer 2 天前
@godiu #73 介绍是 ult-one, go mod 是 ultone, 主要之前还有一个 utl-multi 的模板,也就是一个项目多个 server ,不过现在没咋用了
|
![]() |
83
Aspx 2 天前
都换 Go 了,随意一些。怎么舒服怎么来
|
84
dishangyijiao 2 天前
自己写着玩的话,可以试试 Ruby on Rails ,https://rubyonrails.org/ 。
|
85
itosone 2 天前
|
![]() |
87
Charlie17Li 1 天前 via iPhone
@thisisgpy 口才怎么练的跪求
|
![]() |
88
junwind 1 天前
按你需求,不需要框架啊,直接自己撸就行, 建议前后端分离, 前端 vue+uniapp ,go 直接抛出接口。 目录结构大概这样就行:
|