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

golang 老鸟快快显圣

  •  
  •   thisisgpy · 31 天前 · 7160 次点击

    背景

    我是从一线开发转行到国企做信息化项目管理,朝九晚五,上班基本就是我去 ZF 那边挨骂,然后我转头去骂外包商,基本没什么事。但是我一直放不下自己的技术情节,Java 写了 10 年也腻了,就想用 golang 自己写点东西玩。

    现状

    我最近尝试用 golang 写一些 web 小玩意儿,但是我很难在网上找到一个适合小项目的项目结构,AI 给的也是大型化的结构。我用 fiber 和 gorm ,viper 做配置文件解析。gorm 的事务管理也比较懵,我都是 cursor 生成。

    诉求

    请各位针对我只搞小玩意儿的诉求,指点一个 mini 的项目结构,推荐技术选型,指点一下 gorm 的事务控制。

    91 条回复    2025-02-22 00:04:20 +08:00
    root71370
        1
    root71370  
       31 天前
    放下 java 思想
    xxmaqzas
        2
    xxmaqzas  
       31 天前
    gf 不行么?
    laikick
        4
    laikick  
       31 天前
    不过小项目根本没啥必要纠结项目结构.
    layxy
        5
    layxy  
       31 天前   ❤️ 1
    Kratos 的工程结构可以参考下,虽然是 rpc 框架,但是你写 web 也可以
    lesismal
        6
    lesismal  
       31 天前   ❤️ 12
    @laikick golang-standards/project-layout 这个根本不算是好的结构:

    而且这个 repo 作者可以算是 go 社区里最不要脸的了,我都不敢用“最不要脸的之一”来描述他、怕“之一”不准确:
    https://github.com/golang-standards/project-layout/issues/117

    请做个好人,不要再向别人推荐这个带来更多误导。
    laikick
        7
    laikick  
       31 天前   ❤️ 1
    @lesismal 是的是的 孩子 你是对的
    Ayanokouji
        8
    Ayanokouji  
       31 天前   ❤️ 1
    @lesismal 好巧,我也不喜欢这个目录结构
    @thisisgpy 我是基于这个项目改的 https://github.com/mikestefanello/pagoda
    lesismal
        9
    lesismal  
       31 天前   ❤️ 11
    > 是的是的 孩子 你是对的

    @laikick 其实如果自己不会好好说中文的话,可以完全去混非中文圈,看到过别人喷你、这不是糟蹋自己嘛,何必呢
    wogogoing
        10
    wogogoing  
       31 天前
    如果是这样的话,那我安利下我的开源项目:

    https://github.com/keepchen/go-sail
    laikick
        11
    laikick  
       31 天前
    @lesismal 你是对的 👍
    loveuer
        13
    loveuer  
       31 天前
    如果是 web 后端的话,我自己有搞一个 https://gitea.loveuer.com/loveuer/ultone
    laikick
        14
    laikick  
       31 天前
    @sn0wdr1am golang-standards/project-layout 这个根本不算是好的结构:

    而且这个 repo 作者可以算是 go 社区里最不要脸的了,我都不敢用“最不要脸的之一”来描述他、怕“之一”不准确:
    https://github.com/golang-standards/project-layout/issues/117

    请做个好人,不要再向别人推荐这个带来更多误导。
    voidmnwzp
        15
    voidmnwzp  
       31 天前 via iPhone
    建议换个用 golang 的公司
    mengzhuo
        16
    mengzhuo  
       31 天前   ❤️ 3
    吵半天,就没人看看官方文档?

    https://go.dev/doc/modules/layout

    还有这个 https://go.dev/doc/
    yiqiao
        17
    yiqiao  
       31 天前
    @lesismal #6 我靠。我好像就是这种结构,那么有没有其他推荐结构呢?#8 给的可以吗?
    lasuar
        18
    lasuar  
       31 天前   ❤️ 1
    有技术情节,咋个连有文档的 gorm 事务都搞不定?怎么个事儿
    lesismal
        19
    lesismal  
       31 天前
    @yiqiao go 的代码没像 java 那么臃肿,这种审美问题,符合团队的标准和自己的喜好不影响效率就行。如果已经在用并且习惯了,不改也没问题,实用主义
    body007
        20
    body007  
       31 天前   ❤️ 1
    把 gf 官方文档看完,只用 gf 一个库就行。
    wkong
        21
    wkong  
       31 天前
    你这样一问,我必须推荐下自己的开源项目: https://github.com/WuKongIM/WuKongIM
    wkong
        22
    wkong  
       31 天前
    Go 写 CRUD 可能不如 Java ,写 IM 还是很爽。
    MagicLi
        23
    MagicLi  
       31 天前
    Java 推荐这个啦,https://goframe.org/ ,其他的慢慢来,找其他优秀项目来参考。
    Hilalum
        24
    Hilalum  
       31 天前   ❤️ 1
    别骂外包,对外包好点
    R0sin
        25
    R0sin  
       31 天前
    用过 v 友推荐的 https://github.com/go-nunu/nunu
    个人感觉用于学习和快速开发都还不错
    strobber16
        26
    strobber16  
       31 天前 via Android
    gorm bug 血多,建议别用
    pkoukk
        27
    pkoukk  
       31 天前   ❤️ 2
    我建议你看一眼 prometheus 的源码: https://github.com/prometheus/prometheus
    上面哪个项目代码质量能比 prometheus 好?
    懂了么?根据你的项目而定,想怎么摆怎么摆,go 没那么多限制
    sakurawzt
        28
    sakurawzt  
       31 天前
    和我一样,我也想写个 go 的项目,最后发现没有适合的项目结构,没有和 springboot 这样一统江湖的存在。
    gufeng311
        29
    gufeng311  
       31 天前
    小项目直接平铺就行了,你就是想得太多
    ninjashixuan
        30
    ninjashixuan  
       31 天前
    加点 internal 以及注意避免循环依赖,剩下的根据业务自己发挥了。
    thisisgpy
        31
    thisisgpy  
    OP
       31 天前
    @lasuar 因为现在写代码不是我的 KPI 了,我只追求结果。不像以前还干开发的时候,要去搞懂技术细节。
    thisisgpy
        32
    thisisgpy  
    OP
       31 天前
    @strobber16 我也用过 sqlx 。习惯于 java 的 mybatis ,其实都不太习惯。你有更好的推荐吗?
    Jinnrry
        33
    Jinnrry  
       31 天前
    @strobber16 然而事实就是除了 grom ,每一个能打的。什么 sqlx 、xorm ,功能上根本就不如 gorm
    Nazz
        34
    Nazz  
       31 天前
    建议使用全局变量, 显式控制服务加载顺序避免依赖循环, 路由和请求处理, 输入输出定义, 业务逻辑放一个包内
    Nazz
        35
    Nazz  
       31 天前
    路由框架就用 gin
    lysShub
        36
    lysShub  
       31 天前
    我去 50k 的星星,绝对是刷的
    biu7
        37
    biu7  
       31 天前
    快教教我们怎么去国企做信息化项目管理,工资咋样?(项目结构用 kratos 或者 gf 的就行)
    biu7
        38
    biu7  
       31 天前
    话说这么多层楼,orm 没有一个用 ent 的吗?
    gitrebase
        39
    gitrebase  
       31 天前
    在 Go “使用 struct 或 func 需要加上 package 包名前缀”的前提下,建议扁平化组织结构:即以一个领域为一个 package ,将各个文件**扁平地**分布在这个文件夹下(没必要就不需要加第二层文件夹)
    qloog
        40
    qloog  
       31 天前
    wangritian
        41
    wangritian  
       31 天前
    goframe 不错很多人推荐了,小项目建议只分 controller service model 三层
    zhoujx
        42
    zhoujx  
       31 天前
    你写的代码量有多少?很复杂吗?如果只是玩玩的,直接不用分目录了,直接干
    zhoujx
        43
    zhoujx  
       31 天前
    先平铺,以后项目大了再找个合适的框架再调整就行了
    leonshaw
        44
    leonshaw  
       31 天前 via Android
    @laikick 原来如此,我说怎么那么多项目喜欢放个 pkg 目录,跟 src/main 一样简直是脱了裤子放屁。
    bulo
        45
    bulo  
       31 天前
    工作十年还在纠结语言??
    harlen
        46
    harlen  
       31 天前
    @thisisgpy sqlc + ent
    fxjson
        47
    fxjson  
       31 天前
    https://github.com/fanqingxuan/go-gin, 我自己用 gin+gorm+go-redis 库开发的一个开箱即用框架,个人感觉比较适合小项目
    bug123
        48
    bug123  
       31 天前
    写了十几年 golang ,都是一把梭哈

    - view
    -- base
    -- ...

    - static
    -- js
    -- css
    -- ...

    - controller
    -- ...

    - utils
    -- ...

    main.go
    run.sh
    ...
    thisisgpy
        49
    thisisgpy  
    OP
       31 天前
    @bulo 我是不再依靠写代码维生,也没太多兴致去探索技术。现在只是还有一点情怀,想着方便自己,做点小东西,所以看 golang 简洁,就想着拿来用。至于说帖子的主题,其实也是没有从 java 复杂的项目结构思维中脱离出来,所以来提问寻求指点。
    thisisgpy
        50
    thisisgpy  
    OP
       31 天前
    @biu7 我高中学文科,大学读的金融,毕业搞了 10 年开发,挺离谱的经历。然后我口才蛮好,文笔也不错,所以转国企就比较顺当。
    strobber16
        51
    strobber16  
       31 天前 via Android
    @thisisgpy 没有,建议放弃 orm ,用标准库 sql
    xfurther01
        52
    xfurther01  
       31 天前
    https://github.com/zeromicro/go-zero
    这个国内的开源项目,基本上和我现在公司自研的一套在思想上大同小异
    qq1340691923
        53
    qq1340691923  
       31 天前
    如果不忙的话并且想学 go 的话,可以用 go 给 ElasticView 写插件,插件模板工程地址: https://github.com/1340691923/eve-plugin-vue3-template
    durban126
        54
    durban126  
       31 天前
    Felldeadbird
        55
    Felldeadbird  
       31 天前   ❤️ 1
    写 go 把 go 当成面向过程,全是在调用函数 就没那么大负担了。

    gorm 事务不是很简单吗。跟着文档声明就好了。
    extrem
        56
    extrem  
       31 天前
    理解你的想法,但是建议你多想想为什么要这么做

    就是说,要写代码直接去写就好了,不是一定遵循什么“项目结构”才能写,如果说项目到了那个地步你自然不会再纠结这个问题

    另外,别用 gorm ,直接用最原始的 sql 拓展如 sqlx
    linyuyizhizou
        57
    linyuyizhizou  
       31 天前
    建议学学 Rails 。
    CinHaiZio
        58
    CinHaiZio  
       31 天前
    pkg 放公用, 框架 初始化方法, 工具类, 配置, app 放业务逻辑, 什么 ctrl,service 可以塞这,其他玩意也可以塞这, app/cmd 放启动的,

    完啦, 加个 script, config, resource, 加个 deploy 放 nginx.conf,dockercompose

    模块化就/app/{module}/cmd/main.go 咯
    kevinpendragon
        59
    kevinpendragon  
       31 天前
    其实大佬写小项目也是一把梭。。。结构本身不是很值得纠结的东西
    LanhuaMa
        60
    LanhuaMa  
       31 天前
    @laikick #11 他对不对看点赞数就知道,你算哪根葱要你来确认他是对的?
    laikick
        61
    laikick  
       31 天前
    @LanhuaMa 那咋了?
    crackidz
        62
    crackidz  
       30 天前
    你已经用 cursor 了,直接问 cursor 啊...
    javalaw2010
        64
    javalaw2010  
       30 天前
    go 没有什么标准的项目结构,假设你的项目足够小,一个 main.go 就足以了。go 这玩意儿主打的就是一个随心所欲,爱咋咋地。
    asen001
        65
    asen001  
       30 天前
    看过很多开源的 web 项目,挺多都是直接在 controller 中梭哈
    4Et5ShxMIq58n6Lr
        66
    4Et5ShxMIq58n6Lr  
       30 天前
    之前社区发过一个悟空聊天的 IM 项目,他的服务端你可以看看,个人感觉挺好懂的,我自己写的小项目就是复制他的结构,
    zxjxzj9
        67
    zxjxzj9  
       30 天前
    足够小的话 controller 梭哈都可以。想要一点正经项目的,我的理解就是把路由(面相 http 的部分),逻辑处理和面相数据库的部分分三个包出来各管各的就可以了。 简单来说 gorm 层就负责 crud ,controller (或者其他 any 叫法)就负责把你的从数据库里的东西变成你要丢给 http 的形式,然后用框架的路由层负责把这坨东西丢回去。
    godiu
        68
    godiu  
       30 天前
    我也在找,之前论坛也有个推荐贴。go-frame eagle go-web-template go-laravel ,go-hertz ,好多个,我都试了下,结果正经代码一行没写,全在试框架。
    我的要求比较零散,gin ,sql 最好用 gorm ,接口能方便加中间件,封装层级不要太多。这样我可以方便那里做 web 的小项目。代码生成可有可无。
    很多都是封装太复杂了,写一个接口好多定义。
    ldyisbest
        69
    ldyisbest  
       30 天前
    jarytom
        70
    jarytom  
       30 天前
    gin-vue-admin
    zgcwkj
        71
    zgcwkj  
       30 天前
    noyidoit
        72
    noyidoit  
       30 天前
    几十个函数几千行的小玩意你全都写在 main.go 里面都行,想稍微讲究点就接着搞 MVC 那套,小项目去掉 service 只留 controller 和 model 。至于事务控制,gorm 的事务挺简单的,不知道你想问什么
    godiu
        73
    godiu  
       30 天前
    @loveuer 你这个挺适合我,有个小问题,readme 里面标题是 utl-one ,项目是 ult 。
    vegetableChick
        74
    vegetableChick  
       30 天前
    @laikick 用这 B 头像,这是好事儿啊!
    sthwrong
        75
    sthwrong  
       30 天前
    没有标准,注意循环引用问题,注意是否有内部包要求,其他的只要满足需求随便搞。至于框架,本质就是路由管理,也以满足需求为准,比如是否方便生成相对标准的文档,有这需求可以用 go-zero ,goframe 等这些进行了一定规范设计的框架,要么就 gin,fiber 之类的接近只有路由功能的组装其他库自撸。
    JKeita
        76
    JKeita  
       30 天前
    小东西,自己怎么舒服怎么来就行了。
    cumt21g
        77
    cumt21g  
       30 天前
    直接看看 K8s 及其相关项目的项目结构
    encro
        78
    encro  
       30 天前
    Akkuman
        79
    Akkuman  
       30 天前 via Android
    说说我目前在用的,我目前用的大多是代码生成式的,不过也有点难受

    首先我会拿 postman 等工具先定义好接口到处 openapi 文档

    entgo:orm 生成
    ogen:根据 openapi 文档生成代码

    好处是预先生成了大量样板代码,缺点也是这个,导致一些比较高阶的自定义操作需要对库有比较深的了解
    dog82
        80
    dog82  
       30 天前
    现在最应该学 python ,不过啥语言都差不多哈
    coderzhangsan
        81
    coderzhangsan  
       30 天前   ❤️ 1
    好多转 go 的人,会把母语的思想带入进来,例如 java/php ,封装 go 框架和库,基本都是围绕之前框架设计思想来的,用 oop 去写 go 代码,跟 go 语言设计是相违背的,写起来怪怪的,不过有一点,面向工作或工资编程,这么做也没什么不对的😂。
    loveuer
        82
    loveuer  
       30 天前
    @godiu #73 介绍是 ult-one, go mod 是 ultone, 主要之前还有一个 utl-multi 的模板,也就是一个项目多个 server ,不过现在没咋用了
    Aspx
        83
    Aspx  
       30 天前
    都换 Go 了,随意一些。怎么舒服怎么来
    dishangyijiao
        84
    dishangyijiao  
       30 天前
    自己写着玩的话,可以试试 Ruby on Rails ,https://rubyonrails.org/
    itosone
        85
    itosone  
       30 天前
    @thisisgpy 自荐一下我的代码,可以来看看: https://github.com/go-sigma/sigma

    golang 写的,可以看 main 分支的代码。
    Charlie17Li
        87
    Charlie17Li  
       29 天前 via iPhone
    @thisisgpy 口才怎么练的跪求
    junwind
        88
    junwind  
       29 天前
    按你需求,不需要框架啊,直接自己撸就行, 建议前后端分离, 前端 vue+uniapp ,go 直接抛出接口。 目录结构大概这样就行:
    junwind
        89
    junwind  
       29 天前
    @junwind
    - api // api 接口层,暴露,外部请求的接口,流入这里
    - homeApi.go
    - loginApi.go
    - logic // 业务层,实际的业务在这里处理,由 api 调用
    - loginLogic.go
    - dao // 数据层 , 数据的 curd 在这里处理,由 logic 调用
    - conf // 配置,如果配置多,做目录,如果配置少,一个单文件即可。
    - routes // 路由 , 如果全部走默认的路由规则,可以不需要
    - log // 日志
    - runtime //
    junwind
        90
    junwind  
       29 天前
    @junwind 容易点错了,就发出去了。接着说
    - runtime // 运行时产生的数据,log 也可以放在 runtime 下面
    - upload // 如果有上传文件的,可以放这里,或者走 oss
    - main.go
    - 部署脚本,或 dockerfile 这种。
    maladaxia
        91
    maladaxia  
       28 天前
    @lesismal 我之前居然已经 star 了这个项目. 虽然没看过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:41 · PVG 02:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.