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

golang 老鸟快快显圣

  •  
  •   thisisgpy · 3 天前 · 6405 次点击

    背景

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

    现状

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

    诉求

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

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

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

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

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

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

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

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

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

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

    - view
    -- base
    -- ...

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

    - controller
    -- ...

    - utils
    -- ...

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

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

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

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

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

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

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

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

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

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