V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
karashoukpan
V2EX  ›  Go 编程语言

关于 Go 的工程经验

  •  
  •   karashoukpan · 2 天前 · 3922 次点击

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

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

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

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

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

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

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

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