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 天前 · 4099 次点击

    请教各位大佬,如果每人一句关于 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  
       2 天前
    一个文件里,只使用一次 var 和 type 关键字
    w568w
        8
    w568w  
       2 天前
    业务逻辑不要害怕造轮子,协议标准不要自己造轮子

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

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

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

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

    现在每个渠道建一个库,说是为了后续的扩展,提前做数据隔离,代码实现上写了 proxy 层、route 层、dispatch 层......
    CoderGeek
        31
    CoderGeek  
       2 天前   ❤️ 1
    规范好你的方法,区分好 “指针和引用” 我觉得很重要
    bwangel
        32
    bwangel  
       2 天前   ❤️ 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  
       1 天前
    @nextvay #38 那为啥 k8s 之类的 client ,都要先 new 一下
    dog82
        50
    dog82  
       1 天前
    泛型用起来很爽,别人看起来想吐……
    longzhentian
        51
    longzhentian  
       1 天前
    @Aprdec 有好有不好吧 个人感觉太重了,有种 Go 版的 SpringBoot
    guanzhangzhang
        52
    guanzhangzhang  
       1 天前
    即使写 web ,也要像非 web(cli ,网络,客户端)那样,处理每个 error ,千万不要偷懒
    如果是项目初期,那就要从现在起要求所有人提交代码都需要写单元测试
    每个人都要学会 dlv 和写代码的调试
    不要用 cgo
    bzj
        53
    bzj  
       1 天前
    最好别用 go 写 web 项目,网上的教程基本就是这种,都是 php 或者 java 程序员出的课程,看多了思想容易被污染
    Aprdec
        54
    Aprdec  
       1 天前
    @longzhentian 我感觉比 springboot 复杂多了
    ZekeRuan
        55
    ZekeRuan  
       1 天前
    @bzj 那建议写什么项目,有开源推荐吗
    gvison
        56
    gvison  
       1 天前   ❤️ 1
    可以试试 sponge ,这个项目把工程化做得比较极致。它主要是搞代码生成的(基于 SQL 或 Proto ),生成的代码直接遵循整洁架构。完全是 go 风格,它给出的是一套标准、模块化高、能直接落地的 Go Web/微服务 框架子。用来学习怎么组织大型 Go 项目,或者直接拿来一把梭开发都很合适。https://github.com/go-dev-frame/sponge
    longzhentian
        57
    longzhentian  
       22 小时 0 分钟前
    @Aprdec 复杂感觉也还好,不过自动生成 service 和 dao 到算是方便的。我自己还是觉得 gin 好一些
    supuwoerc
        58
    supuwoerc  
       20 小时 12 分钟前
    如果一点点复制或者硬编码就能解决问题,不要引入大量的抽象和封装。
    bzj
        59
    bzj  
       20 小时 4 分钟前
    @ZekeRuan 转 go 当然是做 web3 ,学会了直接远程工作接到手软
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2586 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:21 · PVG 13:21 · LAX 21:21 · JFK 00:21
    ♥ Do have faith in what you're doing.