V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yikyo
V2EX  ›  程序员

标题: [求推荐] 寻找开箱即用的 Go Web 模板(需 GORM + DI + 垂直切片架构),顺便探讨一下 Go 社区对 DI 的态度

  •  
  •   yikyo · 1 天前 · 2096 次点击

    大家好,

    最近在做 Go 的 Web 项目选型,看了一圈生态里的框架,希望能找到一款偏向开箱即用的模板。想请大家推荐一下:

    我理想中的框架特性:

    • 开箱即用:不想从零开始拼凑路由、日志、配置和 ORM 等基础组件,希望能有一套成熟的默认约定。

    • 深度集成依赖注入( DI ):希望框架能很好地管理对象的生命周期和依赖关系。

    • 集成 GORM:因为业务原因,需要 GORM 作为核心的数据库 ORM 工具。

    • 支持垂直切片架构( Vertical Slice Architecture ):这点极其重要!我不希望代码是按“技术职责”横向分层的(比如所有 controller 在一个包,所有 model 在一个包)。我希望框架的推荐实践是按“业务模块”来组织代码的。例如一个用户的业务,其结构应类似于:

    /user
      ├── user.model.go
      ├── user.repository.go
      ├── user.service.go
      └── user.controller.go
    

    不知道大家有没有符合上述要求的脚手架或框架推荐?

    另外,还有一个疑惑想和大家交流讨论:

    在研究 Go Web 框架和各种开源模板的过程中,我发现一个现象:在 Go 语言生态中,大家似乎对“依赖注入( DI )”并不是特别热衷?

    在 Java (Spring) 或 C# (.NET) 里,DI 几乎是刻在骨子里的标配,不使用 IoC 容器简直没法写代码。

    想听听老哥们的看法,为什么 Go 的社区风气对 DI 容器显得比较克制?

    是因为 Go 强调的“大道至简( Keep it simple )”和显式编程哲学?

    是手动传递依赖在 Go 里写起来并没有那么繁琐?

    还是说使用反射( Reflection )做运行期 DI 在 Go 中有什么性能隐患或难以调试的坑?

    期待大家的框架推荐以及对 DI 问题的看法,提前感谢!

    前提,本人对 go 语言没有任务基础,也是最近刚尝试使用。上面的讨论如有不当之处,请多多包涵。

    50 条回复    2026-02-25 16:33:10 +08:00
    NoobPhper
        1
    NoobPhper  
       1 天前
    把一件复杂的事情做简单是件很难得事情, 不要平白无故的增加 系统熵
    viking602
        2
    viking602  
       1 天前
    社区里用 ent 的居多 我们自己也是用的 ent gorm 的话我建议是自己搓一个脚手架 自己搓的才是最符合自己需求的
    Ayanokouji
        3
    Ayanokouji  
       1 天前
    推荐这个项目,进行定制自己的 template 。https://github.com/samber/do-template-api
    Gilfoyle26
        4
    Gilfoyle26  
       1 天前
    go 的 Web 还有可选的嘛,除了 gin 还能选择什么?

    不过我是直接手搓 web 框架,极致的手工业。
    yikyo
        5
    yikyo  
    OP
       1 天前
    @Ayanokouji
    @viking602

    感谢,我晚点去看一下
    yikyo
        6
    yikyo  
    OP
       1 天前
    @Gilfoyle26 年后才开始接触 go ,扡 gin fiber echo iris 都看了一下。
    aapeli
        7
    aapeli  
       1 天前
    @yikyo #6 我的意见是能不用 DI 就不用 DI ,用 AI 做 Code 生成,没必要再增加一步 DI 过程。
    lifei6671
        8
    lifei6671  
       1 天前
    @yikyo #6 推荐一个邪修 go web 框架:goframe ,这个框架有点反人类。
    yikyo
        9
    yikyo  
    OP
       1 天前
    @NoobPhper 刚接触 go 有点不适应。跟我的想象中的不一样。
    yikyo
        10
    yikyo  
    OP
       1 天前
    @lifei6671 不搞。。。怕搞坏了。。。
    Dorathea
        11
    Dorathea  
       1 天前
    GIN 应该可以满足你的大部分需求, ORM 有对应的库(GORM)

    至于 DI 的问题, 可以了解下 golang 的 interface
    Immortal
        12
    Immortal  
       1 天前
    不明白为什么上面说 GoFrame 是邪修.
    写 Go 快 10 年了,从一开始的 Martini/Beego 时代,到后面折腾 gin/echo 一类"路由框架",也用过 go-zero 和 GoFrame.
    现在 web 项目如果没有特殊要求我就默认用 GoFrame 了.

    Gin/Echo/Chi 一类就像我上面说的更像"路由框架".作为轻量级的 Web 框架有利就有弊
    如果项目不是按传统的 MVC 这类架构来展开,需要使用 DDD 这样的,那么基本只能选这类框架自己搭建脚手架.
    容易上手写写小项目,但是做中大型项目需要一些底子来组织文件/项目的结构,不然越写越乱.
    还有 Model 层需要自己去找合适的.Gorm/Ent/Sqlc 这类,个人推荐 Echo+Sqlc

    写到后期其实 Web 基本就那么一回事.Router->Logic(Controller)->Service(公用逻辑封装)->Model.
    Go-Zero/GoFrame 基本都做到了这些,GoFrame 的 Model 感觉比 Gorm 一类更方便,所以推荐.
    OrangeAdd
        13
    OrangeAdd  
       1 天前
    个人实际工作下来,大部分项目其实都是一个路由框架( Gin )、ORM 框架( GORM )就够用了,需要啥基本都是 new 一个就可以了。
    Immortal
        14
    Immortal  
       1 天前
    @Immortal #12
    是我审题不清了.
    OP 情况那就 Echo+Gorm 吧
    gitrebase
        15
    gitrebase  
       1 天前
    Go 里的 DI 没有一个像 Java 里的 DI 那么好用,真不如在 main.go 里手搓几行 new(XxxService)
    bingo084
        16
    bingo084  
       1 天前
    垂直切片架构这个,我之前也很想用,但是发现按这样分包之后,很容易出现循环依赖,然而 go 里又不允许包循环依赖。。不知道怎么搞,最后还是横向分层了。
    BeautifulSoap
        17
    BeautifulSoap  
       1 天前   ❤️ 3
    很多 Go 程序员嘴巴上说 Go 不需要框架,不需要 DI ,不需要分层。面对这些东西的讨论的时候就仿佛触发了什么底层的哈气代码一样有一种天生的仇恨。
    但矛盾的是,实际上真工作中遇到项目对应复杂度的时候,排除掉堆屎山的,大部分人都自己手搓出了对应的简陋的 DI 、DDD 分层框架。只不过大部分人要不根本没意识到自己已经这么干了(取的名字千奇百怪,结构千奇百怪),要不就根本不想承认自己已经这么干了。

    话题偏了,回到 lz 问的问题,我的 Go 项目一般都是在 Gin 上自己分层,DI 虽然有 wire 这东西但真的非常难用,一般我喜欢用 dig 做 DI 。为了避免动态 di 在运行时出问题的坑,我所有依赖都尽量通过工厂函数在服务器启动时完成注入,从不在运行时动态获取依赖。这样一旦依赖出问题就能在启动服务的那一瞬间报错崩溃注意到

    ORM 以前喜欢用 GORM 但是后来发现 GORM 这玩意实在没有多好用,现在喜欢直接 sqlx 。而且我最近的项目很多都涉及到 serverless+Dynamodb ,所以通过分层框架实现多数据库兼容已经是现在项目的基本前提了,一旦系统设计不局限于 sql 要考虑兼容性,就能立刻扩展系统设计水平和意识到分层的重要性
    heartleo
        18
    heartleo  
       1 天前
    yikyo
        19
    yikyo  
    OP
       1 天前
    以上回复我都会认真参考,我作为新手闯进 go 语言的世界,有点颠覆我的想象,所以发个帖讨论一下。

    感谢楼上各位的回复。
    ColinLi
        20
    ColinLi  
       1 天前
    使用 wire
    wangtufly
        21
    wangtufly  
       1 天前
    kratos,你就用吧
    Hstar
        22
    Hstar  
       1 天前
    你这个喜好,用 Go 是给自己找事。
    就说你喜欢的‘按“业务模块”来组织代码’,天才,如果多个“业务模块”之间有循环引用怎么办,比如新增了一个 account 模块,想调用 user 的 service ,然后发现 user 的 service 也想调用 account 的 service 。只能使用 DI ,把所有对象在 root 上初始化好,按需调用对吧?你发现了吗,你凭空增加了复杂度,而且几乎没有带来任何正向收益,可能就满足了你的喜好。
    explore365
        23
    explore365  
       1 天前
    kfpenn
        24
    kfpenn  
       1 天前
    去年有一个项目尝鲜的用了 DI ,反正用下来没感觉有什么便捷的,以后应该不会特地去用了
    treblex
        25
    treblex  
       1 天前
    https://github.com/maximhq/bifrost 这个是个 ai 转发,我觉得做的很漂亮,动态插件模式,学到很多

    web 框架最终还是做了个工具包,然后项目模版直接使用 gin ,https://github.com/lazyfury/bowlutils

    目录结构是这样,不过框架无关的,不是强制的

    NaVient
        26
    NaVient  
       1 天前
    在不同的厂写过几个复杂业务有的用 DI ,有的不用。个人用下来感觉 DI 在 Go 里是完全多余的
    redbule
        27
    redbule  
       1 天前   ❤️ 2
    go 羸弱的元编程能力决定了它的 DI 不会好用,老老实实大道至简就行了
    wogogoing
        28
    wogogoing  
    PRO
       1 天前 via iPhone
    那我推荐一下我的开源项目给 op 吧:

    https://github.com/keepchen/go-sail

    没有完全满足 op 的要求。
    ljian6530
        29
    ljian6530  
       1 天前
    最近写的项目用 nunu ,大佬可以看看是否满足需求 https://github.com/go-nunu/nunu
    70k
        30
    70k  
       1 天前
    Claude 3.5 的时候他给我用了 go-chi 然后去看了一眼感觉比 gin 简洁明了 以后就准备用这个了
    现在用 ai 写业务逻辑 自己不准备维护的话直接 Sqlx 就行了 自己想维护就让 ai 分一个数据库操作的层
    liuliuliuliu
        31
    liuliuliuliu  
    PRO
       1 天前
    我不是很理解,做 web 为啥用 go?
    xpzouying
        32
    xpzouying  
       1 天前
    之前研究过整洁架构的时候,设计了一套架构,可以看看:
    https://github.com/xpzouying/go-clean-arch

    用的是 wire 进行依赖注入。

    ---

    不过个人觉得非必要不要搞这么复杂,特别是团队协同中,是双刃剑。(真实的生产经验。。。)
    一方面:如果没有很好的规范,确实团队协同中,很快代码就会乱掉,代码只要能放到一个地方编译通过就直接放到了,后面也不会轻易移动它。(谁能扛住生产的线上问题呢?。。。)

    另外一方面:如果要引入规范,特别是 DDD / 整洁架构这套的话,那么就需要让全部团队的同学熟悉对应的规范,然而团队中每个同学对于 **规范** 以及 **业务** (非常重要)的理解是不一样的,所以一定要做好 code review ,否则也会是屎山。

    ---

    可以先看看我整理的这套整洁架构的思想规范和代码模板,至少在原来公司的生产环境用过。
    Ayanokouji
        33
    Ayanokouji  
       21 小时 40 分钟前
    wire 已经 archived 了,为什么还这么多人推荐 wire 。
    基于泛型的 DI ,如 https://github.com/samber/do ,看起来也还行
    manhere
        34
    manhere  
       21 小时 11 分钟前
    yikyo
        35
    yikyo  
    OP
       20 小时 48 分钟前 via iPhone
    @liuliuliuliu 请教一下 go 不适合做 web 吗? go 最合适的不是云相关的业务吗,
    yikyo
        36
    yikyo  
    OP
       20 小时 47 分钟前 via iPhone
    @70k 谢谢,好多人推荐 sqlx ,我再重新考虑一下
    calcium
        37
    calcium  
       20 小时 24 分钟前
    数据库方面,bun 也可以了解一下,比 sqlx 复杂一些,但是比 gorm 简单得多
    ryan961
        38
    ryan961  
       20 小时 7 分钟前
    看了一圈都没人推荐 kratos ( https://go-kratos.dev/docs/)吗? 我觉得这个对于新手入门挺合适的(虽然现在迭代缓慢...),我推荐 op 可以去看看他 layout 的相关文章及毛剑相关的分享视频。自己可以尝试用它构建个项目看看,后面再去看看 cloudwego ( hertz 、kitex )...啥的其实都差不太多

    - https://go-kratos.dev/zh-cn/blog/kratos/go-project-layout/
    - https://go-kratos.dev/zh-cn/blog/kratos/go-project-wire/
    - https://github.com/go-kratos/beer-shop
    yuandj
        39
    yuandj  
       20 小时 4 分钟前
    https://github.com/assoyuan/gingo
    之前自己基于 gin 框架封装了一个,可以看看是否符合你的要求
    Ayanokouji
        40
    Ayanokouji  
       19 小时 35 分钟前   ❤️ 1
    @yikyo #36 别用 sqlx ,1 已经好久没更新了,2 很难用,3 如果不喜欢 orm 那就用 sqlc
    layxy
        41
    layxy  
       19 小时 28 分钟前
    没有 ai 的时候 di 可以简化一些依赖处理,有 ai 了就别这么折腾了,go 的 di 说白了两种方式,一种反射路线,一种代码生成路线,反射一般都有性能损耗就不说了,代码生成 ai 完全可以取代
    9136347
        42
    9136347  
       17 小时 3 分钟前
    prompt:使用 gin+gorm+wire 帮我构建一个基础的框架,需要有单独的路由配置+控制器+服务层+数据层以及工具目录。各个组件之间使用 wire 组合。需要有配置中心,支持 yaml 文件、nacos 、环境变量。
    liuliuliuliu
        43
    liuliuliuliu  
    PRO
       16 小时 51 分钟前
    @yikyo #35
    适合云相关的基础设施,例如 k8s ,docker 。
    但是受限于极简的表达力,很少用来写业务,web 网站一般都是业务优先的。
    tpopen
        44
    tpopen  
       16 小时 22 分钟前
    goframe
    Desdemor
        45
    Desdemor  
       16 小时 17 分钟前
    https://github.com/8treenet/freedom 你看看这个,DI 也是走的反射
    zoharSoul
        46
    zoharSoul  
       15 小时 16 分钟前
    go 不要弄所谓的垂直切片, 因为那个叼毛循环依赖问题很难完全避免
    freemoon
        47
    freemoon  
       15 小时 8 分钟前
    资深 go ,没写过 java ,非常讨厌依赖注入,虽然不是黑魔法,但是固化的开发范式过度限制了我的开发习惯,也降低了我的开发效率。
    CodersZzz
        48
    CodersZzz  
       14 小时 51 分钟前
    没了解过 go 和 python,但是一般这些预约的程序员说到 java 时,就会嘲讽过度封装等。
    请问在 go 语言中,不做抽象 封装吗?比如:业务的通知方式有多种(短信,webhook ,邮箱等)这些不做抽象封装吗,难道写 if else 吗,当然不是引战,只是单纯的了解,感觉这样的代码写多了,会不会容易形成屎山代码 不好维护呢。
    zhaohua
        49
    zhaohua  
       13 小时 46 分钟前
    go-zero 加 领域驱动 即可。 真想用 di ,可以考虑加个 ent 但是实际上不用也行。
    EricYuan1
        50
    EricYuan1  
       13 小时 39 分钟前
    @liuliuliuliu #43 那为啥字节、Uber 用 go 开发 web 呢?
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   868 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:12 · PVG 06:12 · LAX 14:12 · JFK 17:12
    ♥ Do have faith in what you're doing.