The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
karashoukpan

关于 Go 的工程经验

  •  
  •   karashoukpan · Dec 3, 2025 · 7498 views
    This topic created in 345 days ago, the information mentioned may be changed or developed.

    请教各位大佬,如果每人一句关于 Go 工程(不局限于 Web 或者基架项目)开发的经验,会是什么?

    61 replies  •  2025-12-08 15:27:18 +08:00
    yeelooyeeuu
    yeelooyeeuu
    Dec 3, 2025
    1
    简单搞过一个项目,go 用起来似乎不错
    sunny352787
    sunny352787
    Dec 3, 2025
    2
    别搞太抽象,当 C 写
    WaldenHorizon
    WaldenHorizon
    Dec 3, 2025❤️5
    3
    不要写成 java
    wakarimasen
    wakarimasen
    Dec 3, 2025
    4
    泛型出现之前你可能需要熟练掌握编辑器快捷键,同时生成所有整数类型的比大小函数。
    wogogoing
    wogogoing
    Dec 3, 2025 via iPhone
    5
    尽可能不要忽略错误;组合机制很棒,好好利用起来。
    lervard358
    lervard358
    Dec 3, 2025
    6
    @wakarimasen go 已经有支持泛型了
    chengrui0428
    chengrui0428
    Dec 3, 2025
    7
    一个文件里,只使用一次 var 和 type 关键字
    w568w
    w568w
    Dec 3, 2025
    8
    业务逻辑不要害怕造轮子,协议标准不要自己造轮子

    开始开发前约定好规范,如「逻辑上可空的变量用 nil pointer 还是空值表示」「可选参数配置用 option pattern 还是 builder pattern 还是生成重载函数」

    Be stupid ,不要耍聪明省代码行数而写出费解的代码。Go 很冗长并且它就该冗长,冗长比晦涩好
    povsister
    povsister
    Dec 3, 2025
    9
    调用任何非标准库的函数前点进去看一眼实现,别盲目相信注释
    iseki
    iseki
    Dec 3, 2025
    10
    可以积极借鉴其它语言的标准库设计,特别是那些有丰富标准库经验的。
    5261
    5261
    Dec 3, 2025
    11
    @wangritian 哎,Java 开发写 go 项目,写着写着就变成 Java 结构和思想了,现在 go 项目中都加入了自动注入的概念了
    MIUIOS
    MIUIOS
    Dec 4, 2025
    12
    @5261 说明你完全没理解编程原理,自动注入和依赖反转从来不是 java 和 spring 的专属,这是概念级别的东西,不是语言层面的,是实际业务中繁衍出来的。
    MIUIOS
    MIUIOS
    Dec 4, 2025
    13
    suyuyu
    suyuyu
    Dec 4, 2025
    14
    @wangritian 晚了 😭
    nanwangnongfu
    nanwangnongfu
    Dec 4, 2025
    15
    每个 goroutine 都 defer recover
    brookegas
    brookegas
    Dec 4, 2025
    16
    开始用 Go 前,先清空 Java/Spring 的那一套便便思维💩
    hamwong
    hamwong
    Dec 4, 2025
    17
    有没有 web 后端最佳实践,自己写还是 java 思维
    spritecn
    spritecn
    Dec 4, 2025
    18
    @iseki 可以考虑把 apahe-common-langx 系列搬过来
    Desdemor
    Desdemor
    Dec 4, 2025
    19
    在对接接口需要加签验签频繁使用 json 序列化和反序列化的时候,浮点型尽量改为字符串。
    jonty
    jonty
    Dec 4, 2025
    20
    @Desdemor #19 这个主要是出于什么考虑?
    cmos
    cmos
    Dec 4, 2025
    21
    golang 的核心是让一万个人都能写出一模一样的代码
    asui
    asui
    Dec 4, 2025
    22
    走?
    Hopetree
    Hopetree
    Dec 4, 2025
    23
    主用 Python 的运维,Go 写命令行工具贼爽,监控插件也很爽
    bbao
    bbao
    Dec 4, 2025
    24
    不要过度设计,我们本没有多数据源设计,我们的一个大数据转后端的工程师,兼容了各大数据库,以及本可以渠道用户独立表+主表映射就可以,设计成了多库~~ 脑壳疼,那代码设计写的,一行都不想看。
    Desdemor
    Desdemor
    Dec 4, 2025
    25
    @jonty 16.0 你用 json 序列化再反序列化 获取的结果是不一样的,但是别人的加签可能是 16.0 你的加签是 16
    5261
    5261
    Dec 4, 2025
    26
    @MIUIOS 意思是这个意思, 我也知道 di 和 ioc 不是 java 和 spring 的专属,只是觉得写 go 会有 java 的味道
    strobber16
    strobber16
    Dec 4, 2025
    27
    我要学 rust
    baiic
    baiic
    Dec 4, 2025
    28
    写的业务多了,自然就会变成 java ,不要一味的贬低 java
    yifeng33
    yifeng33
    Dec 4, 2025
    29
    我要学 rust
    midsolo
    midsolo
    Dec 4, 2025
    30
    @bbao 说起过度设计,那我得展示一下了。

    多渠道的接入,建个 mapping 主表,然后每个渠道映射一张表就行了。

    但我司只会 Java 的架构师嫌我们设计的过于简单,只能自己出手了,各种高层次抽像,各种设计模式,好好的把个 Go 写的项目设计成了 Java 味儿。

    现在每个渠道建一个库,说是为了后续的扩展,提前做数据隔离,代码实现上写了 proxy 层、route 层、dispatch 层......
    CoderGeek
    CoderGeek
    Dec 4, 2025❤️1
    31
    规范好你的方法,区分好 “指针和引用” 我觉得很重要
    bwangel
    bwangel
    Dec 4, 2025❤️3
    32
    1. 多人团队中,别使用 go 启动 goroutine ,封装一个 Go 函数,在里面捕获 panic
    2. golang 中没有 thread local ,一个链路上传递数据,就使用 ctx ,千万不要整花活,https://github.com/timandy/routine 。性能会有问题,而且和很多三方库也兼容不了。
    3. 建议每个函数都加上 ctx 参数和 error 返回值,后面总会用到的
    gaffeyQiu
    gaffeyQiu
    Dec 4, 2025❤️1
    33
    提前做好分层设计, 避免做到一半发现循环依赖了
    shimeow
    shimeow
    Dec 4, 2025❤️1
    34
    到现在我都不知道 Ctx 用来传什么
    写的一个后端项目,感觉只用来停止
    Huelse
    Huelse
    Dec 4, 2025
    35
    怎么简单怎么来,不要想着一个东西实现复杂需求
    maocat
    maocat
    Dec 4, 2025 via Android
    36
    @gaffeyQiu #33
    golang 要循环依赖还挺难的吧,又不是 python
    veni2023
    veni2023
    Dec 4, 2025
    37
    @shinonome #34 接入 trace 时会用到
    nextvay
    nextvay
    Dec 4, 2025
    38
    别用面向对象的写法,new 一个 service ,然后初始化一坨。写 function 就好
    nextvay
    nextvay
    Dec 4, 2025
    39
    @shinonome 先加上。我们这原来是单租户,后来多租户,不同的数据库实例。没有这个 ctx ,需要先把传参都改造了,然后再改造多租户问题。 可以往 ctx 塞租户信息
    cmsyh29
    cmsyh29
    Dec 4, 2025
    40
    @shinonome 联路追踪 日志聚合 用户信息前置塞入 还有一些持久化上下游的值传递,比如用来区分环境等什么的
    karashoukpan
    karashoukpan
    OP
    Dec 4, 2025
    41
    @wakarimasen 哈哈 go 已经有范型了,并且标准库有了 int64 的 min 和 max 可以像 append 一样用 min 和 max
    karashoukpan
    karashoukpan
    OP
    Dec 4, 2025
    42
    @bbao 我觉得任何时候过渡设计都会导致灾难发生,像 Knuth's optimization principle 一样
    karashoukpan
    karashoukpan
    OP
    Dec 4, 2025
    43
    @w568w 学到了,我想可以在加一条,如果用 int 表示系统里面的状态,最好不要从 1 开始(或许可以延伸下,不要使用单位零值作为标志位,例如 0 和 false )

    这在数据库字段更新的时候得单独更新,gorm 的 Update 函数
    liangmeike
    liangmeike
    Dec 4, 2025
    44
    @gaffeyQiu 雷哥?
    karashoukpan
    karashoukpan
    OP
    Dec 4, 2025
    45
    @shinonome 可以参考下 kratos 的 ctx 用法
    GeminiPro
    GeminiPro
    Dec 4, 2025
    46
    @shinonome 感觉同样,这玩意,除了做链路追踪外,没见过做其他用的。
    lance6716
    lance6716
    Dec 4, 2025 via Android❤️1
    47
    记得打开 net/pprof
    Aprdec
    Aprdec
    Dec 4, 2025
    48
    goframe 这框架好吗?看了文档直接看懵了,太多层了吧
    Ayanokouji
    Ayanokouji
    Dec 5, 2025
    49
    @nextvay #38 那为啥 k8s 之类的 client ,都要先 new 一下
    dog82
    dog82
    Dec 5, 2025
    50
    泛型用起来很爽,别人看起来想吐……
    longzhentian
    longzhentian
    Dec 5, 2025
    51
    @Aprdec 有好有不好吧 个人感觉太重了,有种 Go 版的 SpringBoot
    guanzhangzhang
    guanzhangzhang
    Dec 5, 2025
    52
    即使写 web ,也要像非 web(cli ,网络,客户端)那样,处理每个 error ,千万不要偷懒
    如果是项目初期,那就要从现在起要求所有人提交代码都需要写单元测试
    每个人都要学会 dlv 和写代码的调试
    不要用 cgo
    bzj
    bzj
    Dec 5, 2025
    53
    最好别用 go 写 web 项目,网上的教程基本就是这种,都是 php 或者 java 程序员出的课程,看多了思想容易被污染
    Aprdec
    Aprdec
    Dec 5, 2025
    54
    @longzhentian 我感觉比 springboot 复杂多了
    ZekeRuan
    ZekeRuan
    Dec 5, 2025
    55
    @bzj 那建议写什么项目,有开源推荐吗
    gvison
    gvison
    Dec 5, 2025❤️1
    56
    可以试试 sponge ,这个项目把工程化做得比较极致。它主要是搞代码生成的(基于 SQL 或 Proto ),生成的代码直接遵循整洁架构。完全是 go 风格,它给出的是一套标准、模块化高、能直接落地的 Go Web/微服务 框架子。用来学习怎么组织大型 Go 项目,或者直接拿来一把梭开发都很合适。https://github.com/go-dev-frame/sponge
    longzhentian
    longzhentian
    Dec 5, 2025
    57
    @Aprdec 复杂感觉也还好,不过自动生成 service 和 dao 到算是方便的。我自己还是觉得 gin 好一些
    supuwoerc
    supuwoerc
    Dec 5, 2025
    58
    如果一点点复制或者硬编码就能解决问题,不要引入大量的抽象和封装。
    bzj
    bzj
    Dec 5, 2025
    59
    @ZekeRuan 转 go 当然是做 web3 ,学会了直接远程工作接到手软
    xsen
    xsen
    Dec 6, 2025
    60
    没啥不能写的,前后(包括最近一年)用 golang 做的产品、中间件涉及不限于
    web 、中间件、小工具、iot 、系统集成、ai ( onnx 做 intent 识别)、音视频( livekit )诸如此类
    还维护过一个简单的 workflow
    vvmint233
    vvmint233
    Dec 8, 2025
    61
    善用 context
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2137 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 166ms · UTC 13:55 · PVG 21:55 · LAX 05:55 · JFK 08:55
    ♥ Do have faith in what you're doing.