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

关于 Go 的工程经验

  •  
  •   karashoukpan · 1 天前 · 3099 次点击

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

    48 条回复    2025-12-04 21:18:58 +08:00
    yeelooyeeuu
        1
    yeelooyeeuu  
       1 天前
    简单搞过一个项目,go 用起来似乎不错
    sunny352787
        2
    sunny352787  
       1 天前
    别搞太抽象,当 C 写
    wangritian
        3
    wangritian  
       1 天前   ❤️ 4
    不要写成 java
    wakarimasen
        4
    wakarimasen  
       1 天前
    泛型出现之前你可能需要熟练掌握编辑器快捷键,同时生成所有整数类型的比大小函数。
    wogogoing
        5
    wogogoing  
    PRO
       1 天前 via iPhone
    尽可能不要忽略错误;组合机制很棒,好好利用起来。
    lervard358
        6
    lervard358  
       1 天前
    @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  
       17 小时 43 分钟前
    @5261 说明你完全没理解编程原理,自动注入和依赖反转从来不是 java 和 spring 的专属,这是概念级别的东西,不是语言层面的,是实际业务中繁衍出来的。
    MIUIOS
        13
    MIUIOS  
       17 小时 43 分钟前
    suyuyu
        14
    suyuyu  
       17 小时 8 分钟前
    @wangritian 晚了 😭
    nanwangnongfu
        15
    nanwangnongfu  
       16 小时 24 分钟前
    每个 goroutine 都 defer recover
    brookegas
        16
    brookegas  
       16 小时 23 分钟前
    开始用 Go 前,先清空 Java/Spring 的那一套便便思维💩
    hamwong
        17
    hamwong  
       16 小时 3 分钟前
    有没有 web 后端最佳实践,自己写还是 java 思维
    spritecn
        18
    spritecn  
       15 小时 45 分钟前
    @iseki 可以考虑把 apahe-common-langx 系列搬过来
    Desdemor
        19
    Desdemor  
       15 小时 17 分钟前
    在对接接口需要加签验签频繁使用 json 序列化和反序列化的时候,浮点型尽量改为字符串。
    jonty
        20
    jonty  
       15 小时 12 分钟前
    @Desdemor #19 这个主要是出于什么考虑?
    cmos
        21
    cmos  
       15 小时 8 分钟前
    golang 的核心是让一万个人都能写出一模一样的代码
    asui
        22
    asui  
       15 小时 4 分钟前
    走?
    Hopetree
        23
    Hopetree  
       15 小时 1 分钟前
    主用 Python 的运维,Go 写命令行工具贼爽,监控插件也很爽
    bbao
        24
    bbao  
       14 小时 49 分钟前
    不要过度设计,我们本没有多数据源设计,我们的一个大数据转后端的工程师,兼容了各大数据库,以及本可以渠道用户独立表+主表映射就可以,设计成了多库~~ 脑壳疼,那代码设计写的,一行都不想看。
    Desdemor
        25
    Desdemor  
       14 小时 49 分钟前
    @jonty 16.0 你用 json 序列化再反序列化 获取的结果是不一样的,但是别人的加签可能是 16.0 你的加签是 16
    5261
        26
    5261  
       14 小时 43 分钟前
    @MIUIOS 意思是这个意思, 我也知道 di 和 ioc 不是 java 和 spring 的专属,只是觉得写 go 会有 java 的味道
    strobber16
        27
    strobber16  
       14 小时 42 分钟前
    我要学 rust
    baiic
        28
    baiic  
       14 小时 33 分钟前
    写的业务多了,自然就会变成 java ,不要一味的贬低 java
    yifeng33
        29
    yifeng33  
       13 小时 50 分钟前
    我要学 rust
    midsolo
        30
    midsolo  
       13 小时 46 分钟前
    @bbao 说起过度设计,那我得展示一下了。

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

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

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

    这在数据库字段更新的时候得单独更新,gorm 的 Update 函数
    liangmeike
        44
    liangmeike  
       4 小时 53 分钟前
    @gaffeyQiu 雷哥?
    karashoukpan
        45
    karashoukpan  
    OP
       4 小时 51 分钟前
    @shinonome 可以参考下 kratos 的 ctx 用法
    geminikingfall
        46
    geminikingfall  
       4 小时 46 分钟前
    @shinonome 感觉同样,这玩意,除了做链路追踪外,没见过做其他用的。
    lance6716
        47
    lance6716  
       4 小时 33 分钟前 via Android
    记得打开 net/pprof
    Aprdec
        48
    Aprdec  
       4 小时 28 分钟前
    goframe 这框架好吗?看了文档直接看懵了,太多层了吧
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1152 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:47 · PVG 01:47 · LAX 09:47 · JFK 12:47
    ♥ Do have faith in what you're doing.