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