• 请不要在回答技术问题时复制粘贴 AI 生成的内容
thisisgpy
V2EX  ›  程序员

golang 老鸟快快显圣

  •  
  •   thisisgpy · Feb 18, 2025 · 11825 views
    This topic created in 624 days ago, the information mentioned may be changed or developed.

    背景

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

    现状

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

    诉求

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

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

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

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

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

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

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

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

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

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

    - view
    -- base
    -- ...

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

    - controller
    -- ...

    - utils
    -- ...

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

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

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

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

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

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

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

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

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

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